Gibt es eine einfache Möglichkeit, das Seitenverhältnis einer GridLayout-Komponente in Java Swing zu sperren? Oder sollte dies auf dem JPanel geschehen, das dieses Layout enthält?Wie sperren Sie das Seitenverhältnis eines GridLayout in Java?
5
A
Antwort
7
GridLayout
ignoriert effektiv eine bevorzugte Größe der Komponente, aber Sie können die aspect ratio von steuern, was in paintComponent()
gezogen wird, wie in diesem example gezeigt. Die gerenderte Form bleibt kreisförmig (1: 1-Aspekt), während sie den Behälter in der engsten Dimension (fast) füllt. Verändern Sie die Größe des Rahmens, um den Effekt zu sehen.
Nachtrag: Zum Beispiel fügte ich Instanzen von CirclePanel
zu einem GridLayout
unten hinzu.
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
/**
* @see https://stackoverflow.com/a/9858355/230513
* @see https://stackoverflow.com/a/3538279/230513
*/
public class SwingPaint {
private static final int N = 4;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setLayout(new GridLayout(N, N));
for (int i = 0; i < N * N; i++) {
frame.add(new CirclePanel());
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
private static class CirclePanel extends JPanel {
private static final Random r = new Random();
public CirclePanel() {
this.setPreferredSize(new Dimension(80, 80));
this.setForeground(new Color(r.nextInt()));
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
CirclePanel.this.update();
}
});
}
public void update() {
this.setForeground(new Color(r.nextInt()));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension size = this.getSize();
int d = Math.min(size.width, size.height) - 10;
int x = (size.width - d)/2;
int y = (size.height - d)/2;
g.fillOval(x, y, d, d);
g.setColor(Color.blue);
g.drawOval(x, y, d, d);
}
}
}
Es muss etwas sein, für die Sie, ich frage mich kein Beispiel haben !!!! :-) –
Ich bin ein Fan von [sscce] (http://sscce.org/). :-) – trashgod
OK, also sollte das in paintComponent gemacht werden. Herum gespielt, immer noch nicht das Problem gelöst. Momentan suche ich mein Raster in einem JPanel (JPanel -> intermediär JPanel -> GridLayout). Ich versuche, die Größe dieses JPanel-Zwischenspeichers in der paintComponent des Root-JPanel zu steuern. Wie fühlst du dich darüber ? Havent hat es schon funktioniert ... – Jerome