Mee*_* K. 2 java swing paint jframe repaint
我正在尝试按下按钮时显示一个字符串,但它不起作用.我不知道问题是什么.我没有错误,但这并没有打扰我.我想,我遗漏了一些基本的东西.请帮忙!!
//I'm trying to draw a string in the frame when a button is pressed, but it won't work..
//Can't figure out what the problem is.
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class AppletTwo extends JFrame implements ActionListener
{
JFrame frameOne;
JButton btnOne;
AppletTwo()
{
frameOne = new JFrame("frameOne");
frameOne.setSize(320,240);
frameOne.setLayout(new FlowLayout(FlowLayout.LEFT));
frameOne.setVisible(true);
frameOne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btnOne = new JButton("Print");
btnOne.addActionListener(this);
frameOne.add(btnOne);
}
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource() == btnOne)
{
repaint();
}
}
public void paint(Graphics g)
{
g.drawString("Never Works",150,150);
}
public static void main(String[] args)
{
AppletTwo frame1 = new AppletTwo();
}
}
Run Code Online (Sandbox Code Playgroud)
"我想,我错过了一些基本的东西."
是的,你是:
主要问题:
JFrame您要覆盖该paint方法的组件.但是你创建了一个a的另一个实例JFrame,这就是你要做的那个setVisible.请记住,您没有在此框架中绘制任何内容.因此,您将看到框架的新实例,而不是您要绘制的类框架(并且您从未设置可见的框架).其他问题:
您应该总是super.paint[Component]在paint[Component]覆盖后调用
@Override
public void paint(Graphics g) {
super.paint(g);
}
Run Code Online (Sandbox Code Playgroud)不要在顶层容器上涂漆JFrame.而是在a上绘制JPanel或JComponent覆盖paintComponent方法和调用super.paintComponent,然后将该组件添加到框架中.请参阅执行自定义绘画
应该在事件派发线程(EDT)上运行Swing应用程序.您可以通过将main代码包装在一个中来实现SwingUtilities.invokeLater(...).请参阅初始线程
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
AppletTwo frame1 = new AppletTwo();
}
});
}
Run Code Online (Sandbox Code Playgroud)通常,您总是希望在添加组件后将框架设置为可见.
其他说明:
UPDATE
具有上述所有要点的示例.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class SimpleDrawing {
public SimpleDrawing() {
final DrawingPanel panel = new DrawingPanel();
final JTextField field = new JTextField(15);
JButton button = new JButton("Change name");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String someString = field.getText();
if (!someString.isEmpty()) {
panel.setString(someString);
}
}
});
JPanel bottomPanel = new JPanel();
bottomPanel.add(field);
bottomPanel.add(button);
JFrame frame = new JFrame();
frame.add(panel);
frame.add(bottomPanel, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public class DrawingPanel extends JPanel {
private String someString = "Stackoverflow";
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(someString, 75, 75);
}
@Override
public Dimension getPreferredSize() {
return new Dimension (300, 100);
}
public void setString(String someString) {
this.someString = someString;
repaint();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new SimpleDrawing();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)