我正在尝试使用布尔标记基于按钮单击绘制图形。之前,我将布尔值设置为ShapeGUI类中的公共静态布尔类型,并使用Shape.draw在ShapeListener中调用它,虽然大约花了10秒钟来绘制一个绘图。
现在我在ShapeListener类中设置boolean标志。现在它要么不重新粉刷,要么非常缓慢。单击按钮后如何立即显示图形?
public class ShapeGUI extends JFrame
{
public static final int WIDTH = 500;
public static final int HEIGHT = 500;
public ShapeGUI()
{
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//setLayout(new FlowLayout());
setLocationRelativeTo(null);
JMenuBar menu = new JMenuBar();
JMenu file = new JMenu("File");
menu.add(file);
JMenuItem save = new JMenuItem("Save Information");
JMenuItem exit = new JMenuItem("Exit");
file.add(save);
file.add(exit);
setJMenuBar(menu);
ShapeListener test = new ShapeListener();
JButton button = new JButton("Hello");
test.setBackground(Color.CYAN);
button.addActionListener(new ShapeListener());
test.add(button);
add(test);
//followed this person's advice
//First off, your drawing should be done in a paintComponent method override that is held in a class that extends JPanel. Next, this class could have a boolean variable that the paintComponent uses to decide if it will draw a rectangle or not. The button press simply sets the boolean variable and calls repaint on the drawing JPanel.
}
}
public class ShapeListener extends JPanel implements ActionListener
{
boolean draw = false;
Shape s = new Circle();
Shape a = new Rectangle();
@Override
public void actionPerformed(ActionEvent e)
{
draw = true;
repaint();
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(draw)
{
s.draw(g);
}
else
{
a.draw(g);
}
}
}
答案 0 :(得分:2)
你的逻辑有点不对......
ShapeListener test = new ShapeListener(); // First instance
JButton button = new JButton("Hello");
test.setBackground(Color.CYAN);
button.addActionListener(new ShapeListener()); // Second instance...
test.add(button);
add(test);
您创建了ShapeListener
类的两个实例,将一个添加到容器中并使用另一个作为操作侦听器。两者都不会相互了解,这意味着你可以点击奶牛回家,ShapeListener
的第一个实例永远不会改变。
此外,除非您计划覆盖preferredSize
窗格的ShapeListener
方法,否则我会在框架上使用类似BorderLayout
的内容,以确保面板为布局合理,否则看起来面板没有涂漆......
尝试类似......
public class ShapeGUI extends JFrame {
public static final int WIDTH = 500;
public static final int HEIGHT = 500;
public ShapeGUI() {
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JMenuBar menu = new JMenuBar();
JMenu file = new JMenu("File");
menu.add(file);
JMenuItem save = new JMenuItem("Save Information");
JMenuItem exit = new JMenuItem("Exit");
file.add(save);
file.add(exit);
setJMenuBar(menu);
setLayout(new BorderLayout());
ShapeListener test = new ShapeListener();
JButton button = new JButton("Hello");
test.setBackground(Color.CYAN);
button.addActionListener(test);
test.add(button);
add(test);
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
new ShapeGUI();
}
});
}
public class ShapeListener extends JPanel implements ActionListener {
Shape s = new Ellipse2D.Float(0, 0, 20, 20);
Shape a = new Rectangle2D.Float(0, 0, 20, 20);
private Shape paintMe = a;
@Override
public void actionPerformed(ActionEvent e) {
paintMe = s;
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
int x = (getWidth() - paintMe.getBounds().width) / 2;
int y = (getHeight() - paintMe.getBounds().height) / 2;
Graphics2D g2d = (Graphics2D) g.create();
g2d.translate(x, y);
g2d.draw(paintMe);
g2d.dispose();
}
}
}
,而不是...