我正在尝试使用JFrame
,但我无法让super.paintComponents(g);
工作。此外,当我在JFrame
方法中告知时,我的paintComponent()
上没有任何内容。
以下是代码:
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()
合作,但似乎无法弄清楚我做错了什么。我知道它必须是一个简单的修复,但不能发现它的生命。有什么想法吗?
感谢任何和所有帮助。
提前致谢!
答案 0 :(得分:4)
使用paintComponent方法上的@Override
注释进行粗暴的惊喜。这就是为什么使用这个注释非常有用,因为如果你认为自己不应该覆盖方法,它会在编译时标记你。
解决方案:出于多种原因,永远不要在JFrame中“绘制”。而是执行教程告诉您的操作 - 在JPanel或JComponent的paintComponent(...)
方法中绘制。如果你搜索这个网站,你会发现我们在这里告诉了很多人同样的事情,事实上我建议你这样做。如果这个问题作为副本被关闭,我不会感到惊讶,因为这是一个相当普遍的问题。
注意这不会“起作用”(实际上不会编译):
super.paintComponent(g); << Can't seem to get this to work.
出于同样的原因 - 对于JFrame, 没有super.paintComponent(g)
。
另外,关于,
之前我曾经使用过paintComponent(),但似乎无法弄清楚我做错了什么。
但是如果你看一下你以前的代码,你会发现这个方法从未在JFrame中直接使用过,也不应该使用它。
答案 1 :(得分:1)
paintComponent()
是JPanel
类的成员,而不是您尝试调用它的JFrame
类。
这就是您无法拨打super.paintComponent(Graphics g)
的原因。编译器认为您正在创建自己完全不相关的方法,该方法恰好也称为paintComponent()
。
创建一个继承JPanel
的类,并在那里复制并贴上paintComponent()
方法。
就像Hovercraft Full Of Eels所评论的那样,您可以通过直接在方法标题上添加@Override
标记来检查您是否正确覆盖了方法;如果你收到错误,你做错了。
有关JPanel
和JFrame
的详情,请参阅我对this question的回答。