我一直在使用练习GUI来帮助我在将概念添加到我正在开发的真实概念之前编写概念。
问题:在调整窗口大小时,如何让JPanel上的对象动态调整大小?
如果有人有时间并愿意帮助我,我会非常感激。这是我正在使用的“沙盒”GUI:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.*;
import java.util.List;
@SuppressWarnings("serial")
public class PracticeGui extends JPanel {
private static final int PREF_W = 700;
private static final int PREF_H = PREF_W;
private List<Point> POINT_LIST = Arrays.asList(new Point[] {
new Point(40, 40),
new Point(40, 100),
new Point(40, 160),
new Point(40, 220),
new Point(40, 280),
new Point(40, 340),
new Point(40, 400),
new Point(40, 460),
new Point(40, 520),
new Point(40, 580),
new Point(100, 100),
new Point(100, 160),
new Point(100, 220),
new Point(100, 280),
new Point(100, 340),
new Point(100, 400),
new Point(100, 460),
new Point(100, 520),
new Point(100, 580),
new Point(160, 160),
new Point(160, 220),
new Point(160, 280),
new Point(160, 340),
new Point(160, 400),
new Point(160, 460),
new Point(160, 520),
new Point(160, 580),
new Point(220, 220),
new Point(220, 280),
new Point(220, 340),
new Point(220, 400),
new Point(220, 460),
new Point(220, 520),
new Point(220, 580),
new Point(280, 280),
new Point(280, 340),
new Point(280, 400),
new Point(280, 460),
new Point(280, 520),
new Point(280, 580),
new Point(340, 340),
new Point(340, 400),
new Point(340, 460),
new Point(340, 520),
new Point(340, 580),
new Point(400, 400),
new Point(400, 460),
new Point(400, 520),
new Point(400, 580),
new Point(460, 460),
new Point(460, 520),
new Point(460, 580),
new Point(520, 520),
new Point(520, 580),
new Point(580, 580)
});
private JTabbedPane tabbedPane = new JTabbedPane();
private int tabIndex = 0;
public PracticeGui() {
JPanel btnPanel = new JPanel();
btnPanel.add(new JButton(new AddSwitchAction("Add Switch Panel")));
btnPanel.add(new JButton(new PushConfigAction("Push Config")));
btnPanel.add(new JButton(new ActivateAllAction("Activate All"))); //Button I want to work with
setLayout(new BorderLayout());
add(tabbedPane, BorderLayout.CENTER);
add(btnPanel, BorderLayout.PAGE_END);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private class AddSwitchAction extends AbstractAction {
public AddSwitchAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
tabIndex++;
String title = "Switch " + tabIndex;
DrawPanel2 tabComponent = new DrawPanel2(POINT_LIST);
tabbedPane.add(title, tabComponent);
}
}
private class PushConfigAction extends AbstractAction {
public PushConfigAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
/*Add code sending the configuration to the switch panel*/
JOptionPane.showMessageDialog(PracticeGui.this, "Configuration Pushed to Panel");
}
}
private class ActivateAllAction extends AbstractAction {
public ActivateAllAction(String name) {
super(name);
int mnemonic = (int) name.charAt(1);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
Component comp = tabbedPane.getSelectedComponent();
if (comp instanceof DrawPanel2) {
DrawPanel2 drawPanel = (DrawPanel2) comp;
drawPanel.activateAll();
}
}
}
private static void createAndShowGui() {
PracticeGui mainPanel = new PracticeGui();
final double version = 0.1;
JFrame frame = new JFrame("RF Connection Panel " + version);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
@SuppressWarnings("serial")
class DrawPanel2 extends JPanel {
private static final int OVAL_WIDTH = 40;
private static final Color INACTIVE_COLOR = Color.RED;
private static final Color ACTIVE_COLOR = Color.green;
private List<Point> points;
private List<Ellipse2D> ellipses = new ArrayList<>();
private Map<Ellipse2D, Color> ellipseColorMap = new HashMap<>();
public DrawPanel2(List<Point> points) {
this.points = points;
for (Point p : points) {
int x = p.x - OVAL_WIDTH / 2;
int y = p.y - OVAL_WIDTH / 2;
int w = OVAL_WIDTH;
int h = OVAL_WIDTH;
Ellipse2D ellipse = new Ellipse2D.Double(x, y, w, h);
ellipses.add(ellipse);
ellipseColorMap.put(ellipse, INACTIVE_COLOR);
}
MyMouseAdapter mListener = new MyMouseAdapter();
addMouseListener(mListener);
addMouseMotionListener(mListener);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for (Ellipse2D ellipse : ellipses) {
g2.setColor(ellipseColorMap.get(ellipse));
g2.fill(ellipse);
}
}
private class MyMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
for (Ellipse2D ellipse : ellipses) {
if (ellipse.contains(e.getPoint())) {
Color c = ellipseColorMap.get(ellipse);
c = (c == INACTIVE_COLOR) ? ACTIVE_COLOR : INACTIVE_COLOR;
ellipseColorMap.put(ellipse, c);
}
}
repaint();
}
}
public void activateAll() {
for (Ellipse2D ellipse : ellipses) {
ellipseColorMap.put(ellipse, ACTIVE_COLOR);
}
repaint();
}
}