【问题标题】:paintComponent not changing shape油漆组件不改变形状
【发布时间】:2012-12-11 18:47:33
【问题描述】:

有人可以看看我下面的代码并告诉我为什么,当我更改以下两个语句时,我没有看到绘制的矩形发生变化。所以如果我改变:

g.setColor(Color.black); 
g.fillRect(l, w, 100, 100);

即使我将颜色更改为黄色或尝试更改尺寸或位置,该程序仍会打印一个具有相同尺寸和相同位置的黑色矩形。我是蓝J。以下是我的完整代码:

import java.awt.*;
import javax.swing.*;

public class SwingPaintDemo2 extends JComponent {

public static boolean isWall = true;

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI(); 
        }
    });
}


private static void createAndShowGUI() {
    //System.out.println("Created GUI on EDT? "+
    //SwingUtilities.isEventDispatchThread());
    JFrame f = new JFrame("Swing Paint Demo");
    JPanel MyPanel = new JPanel();
     MyPanel.setBorder(BorderFactory.createEmptyBorder(1000, 1000, 1000, 1000));
     MyPanel.setPreferredSize(new Dimension(250, 200));
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(new MyPanel());
    f.pack();
    f.setVisible(true);

}


public void paintComponent(Graphics g) {
    super.paintComponent(g); 
    int l = 10;
    int w = 10;

  g.setColor(Color.black); 
  g.fillRect(l, w, 100, 100);

        }

}

任何建议将不胜感激。

【问题讨论】:

    标签: java swing paintcomponent jcomponent


    【解决方案1】:

    您的 SSCCE 未编译 MyPanel 类在哪里,还是您的意思是 new SwingPaintDemo2()

    假设你的意思是new SwingPaintDemo2()

    代码确实可以正常工作,但 JFrame 的大小非常小:

    因为你没有给它任何大小,并且它的任何组件都没有大小,因为它们没有添加任何组件,因此我们必须使 JComponent 返回正确的大小,所以当我们调用 pack() 我们的 @ 987654328@ 大小正确

    解决方案

    覆盖JComponentgetPreferredSize() 以返回适合所有图形的宽度和高度。

    一些建议:

    • 不要扩展JComponent,而是扩展JPanel

    这是一个示例(您的代码已实现上述修复):

    import java.awt.*;
    import javax.swing.*;
    
    public class SwingPaintDemo2 extends JPanel {
    
        public static boolean isWall = true;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    
        private static void createAndShowGUI() {
            //System.out.println("Created GUI on EDT? "+
            //SwingUtilities.isEventDispatchThread());
            JFrame f = new JFrame("Swing Paint Demo");
            JPanel MyPanel = new JPanel();
            MyPanel.setBorder(BorderFactory.createEmptyBorder(1000, 1000, 1000, 1000));
            MyPanel.setPreferredSize(new Dimension(250, 200));
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new SwingPaintDemo2());
            f.pack();
            f.setVisible(true);
    
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            int l = 10;
            int w = 10;
    
            g.setColor(Color.black);
            g.fillRect(l, w, 100, 100);
    
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(150, 150);
        }
    }
    

    【讨论】:

    • 非常感谢先生,您做到了。有趣的是,我第一次发布的代码没有给我编译错误,也许是因为我在移动东西而导致类损坏?但是当我使用相同的代码创建一个新类时,我看到了编译错误。但无论如何,感谢您花时间帮助我。如果我可以投票给你,我会(仍在努力提高我的声誉 - 新手)。
    • @user1894469 至少现在可以工作了。这不是问题,如果答案是,别忘了检查帖子旁边的勾号。
    • 我正要问你这个问题:) 再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多