Jframe 执行时大小不合适,有什么原因吗?
我正在制作游戏,但每当我运行第二个 jFrame 时,我都必须调整它的大小以便为第二个 jFrame 获得正确的大小,有人知道为什么吗?
I am making a game but whenever i run the second jFrame I have to resize it in order to get the right size for the second jFrame, anyone know why?
这是第一个 jFrame 类中打开第二个的方法:
here is the method in the first jFrame class that opens the second one:
private void playButtonMouseClicked(java.awt.event.MouseEvent evt) {
if (playerOneNameText.getText().equals(""))
{
}
if (playerTwoNameText.getText().equals(""))
{
}
else{
pOneName = playerOneNameText.getText();
pTwoName = playerTwoNameText.getText();
ChessBoardUI class1 = new ChessBoardUI(); // Creating object of Class1
class1.setVisible(true);
this.setVisible(false);
}
}
这是第二个 jFrame 类,我必须调整其大小才能正确定位:
here is the second jFrame class that is the one that I have to resize in order to ge tit right:
package chess;
public class ChessBoardUI extends javax.swing.JFrame {
public ChessBoardUI() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel1 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
blackTeamName = new javax.swing.JLabel();
whiteTeamName = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(null);
getContentPane().add(jLabel2);
jLabel2.setBounds(21, 49, 0, 0);
jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/chess/board.jpg"))); // NOI18N
getContentPane().add(jLabel3);
jLabel3.setBounds(0, 30, 400, 400);
jLabel1.setText("Black:");
getContentPane().add(jLabel1);
jLabel1.setBounds(400, 100, 34, 16);
jLabel4.setText("White:");
getContentPane().add(jLabel4);
jLabel4.setBounds(400, 150, 38, 16);
blackTeamName.setText("jLabel5");
getContentPane().add(blackTeamName);
blackTeamName.setBounds(400, 120, 41, 16);
whiteTeamName.setText("jLabel5");
getContentPane().add(whiteTeamName);
whiteTeamName.setBounds(400, 170, 41, 16);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(ChessBoardUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(ChessBoardUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(ChessBoardUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(ChessBoardUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ChessBoardUI().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel blackTeamName;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel whiteTeamName;
// End of variables declaration
}
推荐答案
我读的很快,寻找特定的方法.
I read very quickly looking for a particular method.
那个方法是:
pack();
JFrame 中的这个方法非常有用但也很难处理,你需要非常了解如何设置每个组件的正确大小.此外,使用null"布局可以轻松实现所有工作.
This method in JFrame can be very useful but also very difficult to handle, you need to understand very well how to set the correct size of each component. Also with a "null" layout can be trivial to have all working.
我的建议是忘记使用
setLayout(null)
因为根据我的经验,它很少能提供比其他布局更好的结果.
Because for my experience it give rarely better results than other layout.
我能告诉你的最好的事情是使用 BoxLayout.使用此布局,您可以精确设置每个组件的位置和大小.诀窍还在于您可以使用rigidArea 和Glue.
The best thing I can tell you is to use BoxLayout. With this layout you can precisely set locations and size for each Component. The trick is also that you can use rigidArea and Glue.
您的代码可以是:
// This is a BoxLayout with top to bottom orientation, the trick is to nest many JPanel
// with BoxLayout in both the direction to have all working
// What I want to achieve is:
//
// 1. Having a main box top to bottom where I will put:
// - Top margin (a rigid area with dimension (0,MARGIN)
// - Main JPanel with BoxLayout and LINE_AXIS (left to right) orientation
// - Bottom margin (a rigid area like top margin)
//
// 2. In the main panel I will put:
// - Left Margin (a rigid area with dimensions (MARGIN,0)
// - A JPanel (leftPanel) Boxed top to bottom containing the things on the left that actually are jLabel3 and jLabel2
// - A little separator between the two panel, a rigid area (10,0) i.e.
// - A JPanel (rightPanel) Boxed top to bottom containing the remaining 4 JLabels
// - Right Margin (as left)
//
// 3. In rightPanel JPanel (BoxLayout.PAGE_AXIS, top to bottom) I will have:
// - a rigid area space to match the position that I want
// - the first label
// - a rigid area.. etc so on
//
// For each JLabel I must set all:
// - setPreferredSize(dimension)
// - setMinimumSize(dimension)
// - setMaximumSize(dimension)
//
// Then, if you specify also the JFrame is better, but you can try to pack().
// BoxLayout take care of sizes, not exceeding maximum and not making it smaller than minimum. Yust try it and you will love it.
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS);
JPanel main = new JPanel();
main.setLayout(new BoxLayout(main, BoxLayout.LINE_AXIS));
this.add(Box.createRigidArea(new Dimension(0,20))); // VERTICAL SPACE (top margin)
this.add(main);
this.add(Box.createRigidArea(new Dimension(0,20))); // VERTICAL SPACE (bottom margin)
JPanel rightPanel = new JPanel();
rightPanel.setLayout( new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS));
JPanel leftPanel = new JPanel();
leftPanel.setLayout( new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS));
main.add(Box.createRigidArea(new Dimension(20,0))); // HORIZONTAL SPACE (left margin)
main.add(leftPanel);
main.add(Box.createRigidArea(new Dimension(10,0))); // HORIZONTAL SPACE (between the two)
main.add(rightPanel);
main.add(Box.createRigidArea(new Dimension(20,0))); // HORIZONTAL SPACE (right margin)
// now you should have understood how it works, just try to fill the right and left panel with your labels. Remember to set preferredm, maximum and minimum sizes.
希望对你有用编辑,我想念一些)"
I hope this is useful to you EDIT, i miss some ")"
相关文章