【问题标题】:Why am I not able to "draw" on my JFrame?为什么我不能在我的 JFrame 上“绘图”?
【发布时间】:2013-07-21 20:22:05
【问题描述】:

我正在尝试使用我的JFrame,但我无法让我的super.paintComponents(g); 工作。此外,当我在我的 paintComponent() 方法中告诉它时,我的 JFrame 没有任何内容。

代码如下:

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

public class MTGSAMPServerReference extends JFrame implements ActionListener {

    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth());
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight());
    private static final long serialVersionUID = 1L;
    private static JList list1;
    private static JButton next;

    public MTGSAMPServerReference() {
        // set flow layout for the frame
        this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
        Object[]mainData = {"Vehicles", "Bikes/Bicycles", "Boats", "Houses", "Businesses", "Objects", "Jobs", "Ranks", "Licenses", "VIP"};
        JPanel controls = new JPanel(new BorderLayout(5,5));
        list1 = new JList<Object>(mainData);
        list1.setVisibleRowCount(10);
        next = new JButton("Next");
        next.addActionListener(this);
        controls.add(new JScrollPane(list1));
        controls.add(next, BorderLayout.PAGE_END);
        controls.setBorder(new EmptyBorder(25,25,0,0));
        add(controls);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Next")) {
            int index = list1.getSelectedIndex();
            System.out.println("Index Selected: " + index);
            String s = (String) list1.getSelectedValue();
            System.out.println("Value Selected: " + s);
        }
    }

    public void createAndShowGUI() {
        //Create and set up the window.
        JFrame f = new MTGSAMPServerReference();
        //Display the window.
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(1200, 800);
        f.setLocationRelativeTo(null);
        list1.setSize(250, 250);
        list1.setLocation(0, 0);
        next.setSize(75, 25);
        next.setLocation(251, 276);
        MTGSAMPServerReference.this.repaint();
    }

    protected void paintComponent(Graphics g) {
        //super.paintComponent(g);  <<  Can't seem to get this to work.
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawRect(0, 0, 50, 50);
    }

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

我之前曾与paintComponent() 合作过,但似乎仍然无法弄清楚我做错了什么。我知道它必须是一个简单的修复,但无法在我的生活中发现它。有什么想法吗?

感谢所有帮助。

提前致谢!

【问题讨论】:

    标签: java swing paintcomponent super flowlayout


    【解决方案1】:

    在您的paintComponent 方法上使用@Override 注释以获得粗鲁的惊喜。这就是为什么使用这个注解非常很有帮助的原因,因为如果你没有在你认为应该覆盖的时候覆盖一个方法,它会在编译时标记你。

    解决方案:出于多种原因,切勿在 JFrame 中“绘制”。而是按照教程告诉您的去做——在 JPanel 或 JComponent 的 paintComponent(...) 方法中绘制。如果你搜索这个网站,你会发现我们在这里告诉过很多人同样的事情,事实上我建议你这样做。如果这个问题被重复关闭,我不会感到惊讶,因为这是一个相当常见的问题。

    请注意,这不会“工作”(实际上不会编译):

    super.paintComponent(g);  <<  Can't seem to get this to work.
    

    出于同样的原因 - 没有 super.paintComponent(g) 用于 JFrame。

    另外,关于,

    我以前使用过paintComponent(),但似乎仍然无法弄清楚我做错了什么。

    但是,如果您查看之前的代码,您会发现此方法从未在 JFrame 中直接使用过,也不应该直接使用。

    【讨论】:

      【解决方案2】:

      paintComponent()JPanel 类的成员,而不是您尝试在其中调用它的 JFrame 类的成员。

      这就是您无法拨打super.paintComponent(Graphics g) 的原因。编译器认为您正在创建自己的完全不相关的方法,该方法也恰好称为paintComponent()

      创建一个继承 JPanel 的类,并将您的 paintComponent() 方法复制并粘贴到那里。

      就像 Hovercraft Full Of Eels 评论的那样,您可以通过在方法标题上直接添加 @Override 标记来检查您是否正确覆盖了方法;如果您收到错误,则说明您做错了。

      有关JPanelJFrame的更多信息,请参阅我对this question的回复。

      【讨论】:

        猜你喜欢
        • 2015-10-07
        • 2017-03-21
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-04
        • 1970-01-01
        相关资源
        最近更新 更多