Java JPanel没有显示,尝试了调用器之类的操作,但仍然没有显示
我在JPanel没有出现时遇到了一些问题(可能是因为swing中的所有线程都是这样的?)。我尝试在添加的地方重新排序,添加Java JPanel没有显示,尝试了调用器之类的操作,但仍然没有显示,java,swing,jpanel,Java,Swing,Jpanel,我在JPanel没有出现时遇到了一些问题(可能是因为swing中的所有线程都是这样的?)。我尝试在添加的地方重新排序,添加SwingUtilities.invokeLater(…)仍然没有工作。在谷歌上搜索时,大多数人只是说使用invokeLater函数,这对我来说并不适用。我假设它不需要布局管理器,因为大小和位置由.SetBounds()完成?这是我目前掌握的密码 public class MenuLogin extends JPanel{ private JTextField txtUse
SwingUtilities.invokeLater(…)代码>仍然没有工作。在谷歌上搜索时,大多数人只是说使用invokeLater函数,这对我来说并不适用。我假设它不需要布局管理器,因为大小和位置由.SetBounds()完成?这是我目前掌握的密码
public class MenuLogin extends JPanel{
private JTextField txtUsername;
private JPasswordField txtPassword;
public MenuLogin(){
setBounds(0, 0, 380, 205);
setBackground(Color.WHITE);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JLabel lblLogin = new JLabel("Login");
lblLogin.setBounds(155, 5, 85, 42);
lblLogin.setFont(new Font("Trebuchet MS", Font.PLAIN, 36));
lblLogin.setHorizontalAlignment(SwingConstants.CENTER);
JPanel form = new JPanel(); // The panel that won't show
form.setBorder(null);
form.setBounds(10, 74, 390, 195);
add(form);
form.setLayout(null);
form.setVisible(true);
txtUsername = new JTextField();
txtUsername.setFont(new Font("Trebuchet MS", Font.PLAIN, 17));
txtUsername.setToolTipText("Username");
txtUsername.setBounds(10, 30, 370, 30);
txtUsername.setColumns(16);
form.add(txtUsername);
txtPassword = new JPasswordField();
txtPassword.setFont(new Font("Trebuchet MS", Font.PLAIN, 17));
txtPassword.setToolTipText("Password");
txtPassword.setColumns(16);
txtPassword.setBounds(10, 78, 370, 30);
form.add(txtPassword);
JButton btnProceed = new JButton("Proceed");
btnProceed.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnProceed.setBounds(150, 119, 94, 30);
form.add(btnProceed);
JButton btnPlayAsGuest = new JButton("Play As Guest");
btnPlayAsGuest.setFont(new Font("Trebuchet MS", Font.PLAIN, 9));
btnPlayAsGuest.setBounds(291, 161, 89, 23);
form.add(btnPlayAsGuest);
JButton btnSignUp = new JButton("Sign Up");
btnSignUp.setFont(new Font("Trebuchet MS", Font.PLAIN, 13));
btnSignUp.setBounds(155, 160, 83, 23);
form.add(btnSignUp);
add(lblLogin);
}
});
}
}
唯一的问题是,第一个JLabel显示。。。
任何关于为什么它仍然没有显示的建议都很好。谢谢。您需要将面板添加到框架中
JFrame frame = new JFrame();
frame.add(form);
您需要将面板添加到框架中
JFrame frame = new JFrame();
frame.add(form);
这应该起作用:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class MenuLogin extends JPanel {
private JTextField txtUsername;
private JPasswordField txtPassword;
public MenuLogin() {
setLayout(new BorderLayout());
setBackground(Color.WHITE);
JPanel form = new JPanel(); // The panel that won't show
form.setVisible(true);
JLabel lblLogin = new JLabel("Login");
lblLogin.setFont(new Font("Trebuchet MS", Font.PLAIN, 36));
form.add(lblLogin);
txtUsername = new JTextField();
txtUsername.setFont(new Font("Trebuchet MS", Font.PLAIN, 17));
txtUsername.setToolTipText("Username");
txtUsername.setColumns(16);
form.add(txtUsername);
txtPassword = new JPasswordField();
txtPassword.setFont(new Font("Trebuchet MS", Font.PLAIN, 17));
txtPassword.setToolTipText("Password");
txtPassword.setColumns(16);
form.add(txtPassword);
JButton btnProceed = new JButton("Proceed");
btnProceed.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
form.add(btnProceed);
JButton btnPlayAsGuest = new JButton("Play As Guest");
btnPlayAsGuest.setFont(new Font("Trebuchet MS", Font.PLAIN, 9));
form.add(btnPlayAsGuest);
JButton btnSignUp = new JButton("Sign Up");
btnSignUp.setFont(new Font("Trebuchet MS", Font.PLAIN, 13));
form.add(btnSignUp);
add(form, BorderLayout.CENTER);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(new MenuLogin());
frame.pack();
frame.setVisible(true);
}
});
}
}
我甚至没有试着找出是哪一种方法导致了这个问题(因为我从不使用它们,你们也不应该使用它们)。我刚刚删除了setBounds
方法,并实现了合适的布局管理器(FlowLayout
——它非常原始)
当涉及到一些高级布局时,我个人更喜欢简单的布局。
还有,看一看
关于。这应该可以:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class MenuLogin extends JPanel {
private JTextField txtUsername;
private JPasswordField txtPassword;
public MenuLogin() {
setLayout(new BorderLayout());
setBackground(Color.WHITE);
JPanel form = new JPanel(); // The panel that won't show
form.setVisible(true);
JLabel lblLogin = new JLabel("Login");
lblLogin.setFont(new Font("Trebuchet MS", Font.PLAIN, 36));
form.add(lblLogin);
txtUsername = new JTextField();
txtUsername.setFont(new Font("Trebuchet MS", Font.PLAIN, 17));
txtUsername.setToolTipText("Username");
txtUsername.setColumns(16);
form.add(txtUsername);
txtPassword = new JPasswordField();
txtPassword.setFont(new Font("Trebuchet MS", Font.PLAIN, 17));
txtPassword.setToolTipText("Password");
txtPassword.setColumns(16);
form.add(txtPassword);
JButton btnProceed = new JButton("Proceed");
btnProceed.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
form.add(btnProceed);
JButton btnPlayAsGuest = new JButton("Play As Guest");
btnPlayAsGuest.setFont(new Font("Trebuchet MS", Font.PLAIN, 9));
form.add(btnPlayAsGuest);
JButton btnSignUp = new JButton("Sign Up");
btnSignUp.setFont(new Font("Trebuchet MS", Font.PLAIN, 13));
form.add(btnSignUp);
add(form, BorderLayout.CENTER);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(new MenuLogin());
frame.pack();
frame.setVisible(true);
}
});
}
}
我甚至没有试着找出是哪一种方法导致了这个问题(因为我从不使用它们,你们也不应该使用它们)。我刚刚删除了setBounds
方法,并实现了合适的布局管理器(FlowLayout
——它非常原始)
当涉及到一些高级布局时,我个人更喜欢简单的布局。
还有,看一看
问候。这是我目前掌握的代码
-这并没有真正的帮助,因为我们不知道您实际在哪里/如何使用此组件我认为它不需要布局管理器
——通常这是一个错误的假设。大多数问题都是由于未使用布局管理器而导致的。Swing设计用于布局管理器。不要到处散布invokeLater
,试图解决您的问题。正如@camickr所说,问题在于您没有布局管理器,您对添加(标签)的调用实际上是对早期添加(JPanel)的重击@brano88的解决方案使用了一个BorderLayout
,应该可以解决这个问题。这是我目前得到的代码
——它没有真正的帮助,因为我们不知道您在哪里/如何实际使用这个组件我认为它不需要布局管理器
——通常这是一个错误的假设。大多数问题都是由于未使用布局管理器而导致的。Swing设计用于布局管理器。不要到处散布invokeLater
,试图解决您的问题。正如@camickr所说,问题在于您没有布局管理器,您对添加(标签)的调用实际上是对早期添加(JPanel)的重击@brano88的解决方案使用了一个边界布局
,应该可以解决这个问题。感谢您的回答,它工作得很好,尽管它是水平的?正如我所说,您必须使用合适的布局,而不是空布局和绝对定位。我将更新我的答案,并链接到几个高级布局管理器。感谢你的回答,它工作得很好,尽管它是水平的?正如我所说,你必须使用合适的布局,而不是空布局和绝对定位。我将更新我的答案,并链接到几个高级布局管理器。