该程序的想法是我在框架上有一些按钮和一个图标SOMEWHERE。我希望按钮改变颜色。我只担心现在所有的元素都出现了。如果我评论第11-13行,我会看到“你好”,打印出来,上面有一个红色圆圈。否则,我只有“红色”按钮没有“你好”或我的红色圆圈。所以这是我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class ButtonTester
{
public static void main (String[] args)
{
JFrame frame = new ButtonFrame();
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
JButton redButton = new JButton("Red");
frame.add(redButton);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class ButtonFrame extends JFrame
{
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
public ButtonFrame()
{
setTitle("Hello");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
ButtonPanel panel = new ButtonPanel();
add(panel);
}
}
class ButtonPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawString("Hello !", 100, 100);
Icon ico = new ColorIcon(32);
ico.paintIcon(null, g, 75, 75);
}
}
我90%肯定问题是第11-13行,但我不确定要改变什么以使一切都可见。
答案 0 :(得分:4)
你的问题是你的ButtonPanel的大小是0.让它覆盖getPreferredSize(),你会看到我的意思:
class ButtonPanel extends JPanel {
private static final int PREF_W = 150;
private static final int PREF_H = PREF_W;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawString("Hello !", 100, 100);
// !! Icon ico = new ColorIcon(32);
// Icon ico = new ImageIcon();
// ico.paintIcon(null, g, 75, 75);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
}
另外,作为一个无关的,为什么要在paintComponent方法中创建一个Icon?这对我来说没有意义,只会不必要地减慢你的图形速度。
修改强>
你说:
好的,我在重写getPreferredSize()之后看到了区别但是创建图标的“更好”或“更正”的方法是什么?我只是想按照Java教科书的练习指示:练习4.14。编写一个程序,显示一个框架,其中三个按钮标记为“红色”,“绿色”和“蓝色”,标签包含一个图标,显示最初为红色的圆圈。当用户单击按钮时,圆的填充颜色应该更改。更改颜色时,需要在标签上调用重绘方法。对重绘的调用确保调用paintIcon方法,以便可以使用新颜色重新绘制图标。
你需要以不同的方式思考。我自己创建了三个ImageIcons,一个用于蓝色圆圈,一个用于红色,一个用于绿色。然后我会在JFrame上的JLabel中显示ImageIcon。我只需通过setIcon(...)
方法交换标签的图标就可以改变颜色。我不会担心paintComponent(...)
,而是试图以尽可能简单的方式解决这个问题。