Java 为什么我不能;画;在我的JFrame上?

Java 为什么我不能;画;在我的JFrame上?,java,swing,paintcomponent,super,flowlayout,Java,Swing,Paintcomponent,Super,Flowlayout,我试图在我的JFrame上画图,但我无法获得我的super.paintComponents(g)开始工作。另外,在我的paintComponent()方法中,当我告诉它时,我的JFrame上没有画任何东西 代码如下: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class MTGSAMPServerReference extends J

我试图在我的
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();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.border.*;
公共类MTGSAMPServerReference扩展JFrame实现ActionListener{
公共静态工具箱tk=Toolkit.getDefaultToolkit();
静态int-ScrnWidth=((int)tk.getScreenSize().getWidth());
静态int-ScrnHeight=((int)tk.getScreenSize().getHeight());
私有静态最终长serialVersionUID=1L;
私有静态JList列表1;
私有静态JButton next;
公共MTGSAMPServerReference(){
//设置框架的流布局
this.getContentPane().setLayout(新的FlowLayout(FlowLayout.LEADING));
Object[]mainData={“车辆”、“自行车/自行车”、“船只”、“房屋”、“企业”、“对象”、“工作”、“等级”、“许可证”、“VIP”};
JPanel控件=新JPanel(新边界布局(5,5));
列表1=新的JList(主数据);
列表1.setVisibleRowCount(10);
下一步=新的按钮(“下一步”);
next.addActionListener(这个);
添加(新的JScrollPane(列表1));
控件。添加(下一步,BorderLayout.PAGE_END);
控制。设定顺序(新的清空顺序(25,25,0,0));
添加(控制);
}
@凌驾
已执行的公共无效操作(操作事件e){
如果(例如getActionCommand().equals(“下一步”)){
int index=list1.getSelectedIndex();
System.out.println(“所选索引:“+Index”);
字符串s=(字符串)list1.getSelectedValue();
System.out.println(“所选值:+s”);
}
}
public void createAndShowGUI(){
//创建并设置窗口。
JFrame f=新的MTGSAMPServerReference();
//显示窗口。
f、 包装();
f、 setVisible(真);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 设置大小(1200800);
f、 setLocationRelativeTo(空);
列表1.设置大小(250250);
列表1.设置位置(0,0);
接下来,设置大小(75,25);
接下来,设置位置(251276);
MTGSAMPServerReference.this.repaint();
}
受保护组件(图形g){

//super.paintComponent(g);在paintComponent方法上使用
@Override
注释会让人大吃一惊。这就是为什么使用此注释非常有用的原因,因为如果您认为应该重写某个方法,而没有重写该方法,它会在编译时标记您

解决方案:出于多种原因,永远不要在JFrame中“绘制”。而是按照教程中的指示进行绘制——在JPanel或JComponent的
paintComponent(…)中绘制
method。如果你搜索这个网站,你会发现我们已经告诉了这里的很多人同样的事情,事实上我建议你这样做。如果这个问题以重复的形式结束,我不会感到惊讶,因为这是一个相当常见的问题

注意,这不会“起作用”(实际上也不会编译):

super.paintComponent(g);
paintComponent()
JPanel
类的成员,而不是您试图调用它的
JFrame

这就是为什么您无法调用
super.paintComponent(Graphics g)
。编译器认为您正在创建自己的完全不相关的方法,该方法碰巧也被称为
paintComponent()

创建一个继承
JPanel
的类,并将
paintComponent()
方法复制粘贴到该类中

就像满是被注释的鳗鱼的气垫船一样,您可以通过在方法头上直接添加
@Override
标记来检查您是否正确覆盖了方法;如果您收到错误,则表明您做错了什么

有关
JPanel
JFrame
的更多信息,请参阅我对的回答

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