Czy istnieje prosty sposób blokowania współczynnika kształtu komponentu GridLayout w Java Swing? Czy powinno to być zrobione na JPanelu zawierającym ten układ?Jak zablokować współczynnik kształtu gridLayout w Javie?
5
A
Odpowiedz
7
GridLayout
skutecznie ignoruje komponentu preferowany rozmiar, ale można kontrolować aspect ratio czegokolwiek jest zasysane paintComponent()
, jak pokazano w tym example. Wygenerowany kształt pozostaje okrągły (aspekt 1: 1), natomiast (prawie) wypełnia go w najwęższym wymiarze. Zmień rozmiar ramki, aby zobaczyć efekt.
Dodatek: Na przykład dodałem N * N
wystąpienia CirclePanel
do GridLayout
poniżej.
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);
}
}
}
Musi być coś, dla których nie ma żadnego przykładu, zastanawiam !!!! :-) –
Jestem fanem [sscce] (http://sscce.org/). :-) – trashgod
OK, więc rzeczy powinny być wykonane w paintComponent. Bawiłem się, wciąż nie rozwiązałem problemu. W tej chwili patrzę na umieszczenie mojej siatki w pośredniku JPanel (JPanel -> pośrednik JPanel -> GridLayout). Próbuję kontrolować rozmiar tego pośrednika JPanel w paintComponent z głównego JPanel. Jak się z tym czujesz ? Jeszcze się nie udało ... – Jerome