我正在努力使用Eclipse WindowBuilder GUI。我已经做了一个布局并且它确实起作用了,但是它在2-3秒后开始滞后并且非常慢。我已经用谷歌搜索了,找到了revalidate()
,validate()
,update()
之类的东西,但是效果却差不多。您能指出我的地方不便吗,所以我不知道是什么原因导致我这样做,现在我很困惑。
源代码:
package forum;
import java.awt.EventQueue;
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.JLabel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class ForumView {
private JFrame frame;
private JTextField txtUsr;
private JTextField txtPasswd;
private JSeparator separator;
private JTextField txtUsr_1;
private JTextField txtPasswd_1;
private JButton btnNewButton_1;
private JSeparator separator_1;
private JButton btnNewButton;
private JButton btnNewButton_2;
private JButton btnNewButton_3;
private JButton btnAddPicture;
private JButton btnNewButton_4;
private JButton btnBack;
private JButton btnSortAlphabetically;
private JButton btnNewButton_5;
private JLabel lblNewLabel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ForumView window = new ForumView();
window.frame.setVisible(true);
window.frame.update(window.frame.getGraphics());
window.frame.revalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public ForumView() {
initialize();
}
public void redrawMethod() {
frame.repaint();
txtUsr.repaint();
txtPasswd.repaint();
btnNewButton.repaint();
separator_1.repaint();
separator.repaint();
txtUsr_1.repaint();
txtPasswd_1.repaint();
btnNewButton_1.repaint();
separator_1.repaint();
btnNewButton.repaint();
btnNewButton_2.repaint();
btnNewButton_3.repaint();
btnAddPicture.repaint();
btnNewButton_4.repaint();
btnBack.repaint();
btnSortAlphabetically.repaint();
btnNewButton_5.repaint();
lblNewLabel.repaint();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 1318, 814);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
txtUsr = new JTextField();
txtUsr.setBounds(10, 11, 86, 28);
frame.getContentPane().add(txtUsr);
txtUsr.setColumns(10);
txtPasswd = new JTextField();
txtPasswd.setBounds(10, 42, 86, 28);
frame.getContentPane().add(txtPasswd);
txtPasswd.setColumns(10);
btnNewButton = new JButton("Login");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(txtUsr.getText());
}
});
btnNewButton.setBounds(106, 10, 89, 23);
frame.getContentPane().add(btnNewButton);
separator = new JSeparator();
separator.setOrientation(SwingConstants.VERTICAL);
separator.setBounds(205, 11, 2, 51);
frame.getContentPane().add(separator);
txtUsr_1 = new JTextField();
txtUsr_1.setText("usr");
txtUsr_1.setBounds(217, 11, 86, 28);
frame.getContentPane().add(txtUsr_1);
txtUsr_1.setColumns(10);
txtPasswd_1 = new JTextField();
txtPasswd_1.setText("passwd");
txtPasswd_1.setBounds(217, 42, 86, 28);
frame.getContentPane().add(txtPasswd_1);
txtPasswd_1.setColumns(10);
btnNewButton_1 = new JButton("register");
btnNewButton_1.setBounds(313, 10, 89, 23);
frame.getContentPane().add(btnNewButton_1);
separator_1 = new JSeparator();
separator_1.setBounds(10, 73, 1282, 2);
frame.getContentPane().add(separator_1);
btnNewButton_2 = new JButton("Add topic");
btnNewButton_2.setEnabled(false);
btnNewButton_2.setBounds(10, 120, 100, 23);
frame.getContentPane().add(btnNewButton_2);
btnNewButton_3 = new JButton("Passwd change");
btnNewButton_3.setEnabled(false);
btnNewButton_3.setBounds(10, 154, 100, 23);
frame.getContentPane().add(btnNewButton_3);
btnAddPicture = new JButton("Add picture");
btnAddPicture.setEnabled(false);
btnAddPicture.setBounds(10, 186, 98, 26);
frame.getContentPane().add(btnAddPicture);
btnNewButton_4 = new JButton("Logout");
btnNewButton_4.setBounds(106, 43, 89, 26);
frame.getContentPane().add(btnNewButton_4);
btnBack = new JButton("Back");
btnBack.setEnabled(false);
btnBack.setBounds(10, 223, 98, 26);
frame.getContentPane().add(btnBack);
btnSortAlphabetically = new JButton("Sort Alphabetically");
btnSortAlphabetically.setEnabled(false);
btnSortAlphabetically.setBounds(10, 257, 98, 26);
frame.getContentPane().add(btnSortAlphabetically);
btnNewButton_5 = new JButton("Add Comment");
btnNewButton_5.setEnabled(false);
btnNewButton_5.setBounds(10, 294, 98, 26);
frame.getContentPane().add(btnNewButton_5);
lblNewLabel = new JLabel("No Photo");
lblNewLabel.setBounds(420, 11, 55, 51);
frame.getContentPane().add(lblNewLabel);
frame.validate();
txtUsr.validate();
txtPasswd.validate();
separator.validate();
txtUsr_1.validate();
txtPasswd_1.validate();
btnNewButton_1.validate();
separator_1.validate();
btnNewButton.validate();
btnNewButton_2.validate();
btnNewButton_3.validate();
btnAddPicture.validate();
btnNewButton_4.validate();
btnBack.validate();
btnSortAlphabetically.validate();
btnNewButton_5.validate();
lblNewLabel.validate();
}
}
谢谢。
编辑:
现在,“主” GUI可以使用,但其他所有功能都处于冻结状态。我使用openfile对话框打开图像文件,但是该对话框也冻结了。这是我尝试过的代码:
btnAddPicture.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
frame.createBufferStrategy(2);
frame.validate();
frame.repaint();
final JFileChooser fc = new JFileChooser();
//RepaintManager.currentManager(fc).setDoubleBufferingEnabled(true);
System.out.println(RepaintManager.currentManager(fc).isDoubleBufferingEnabled());
//returns true
//fc.repaint();
// in response to a button click:
int returnVal = fc.showOpenDialog(frame);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
} else {
System.out.println("Open command cancelled by user.");
}
}
});
编辑2:
在Linux机器上,所有东西都像魅力。
最佳答案
我测试了该代码,对我来说很好用。窗口将打开约2分钟,一切正常。滞后何时开始?单击按钮时?移动窗户?
关于java - Java GUI在两秒钟后马虎,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22962829/