#java #swing #layout-manager
#java #качели #макет-менеджер
Вопрос:
Я работаю над «своего рода» заданием, а не над школьным заданием. Сказав это, любые идеи были бы замечательными.
Я использую WindowBuilder в Eclipse и создал базовую форму. Для его создания я использовал вложенные JPanel
компоненты в макете границы. По какой-то причине панели выглядят так, как будто они выходят за края JFrame. У меня установлены размеры рамки (500, 400), а панели имеют различные размеры, но ни одна из них не превышает 400 в ширину.
Код:
package SwingAssignment;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import java.awt.GridBagLayout;
import javax.swing.BoxLayout;
import net.miginfocom.swing.MigLayout;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import com.jgoodies.forms.factories.FormFactory;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.border.BevelBorder;
import javax.swing.SwingConstants;
public class Swing_Assignemnt {
private JFrame frmWindowBuilderAssignment;
private JPanel Center_Panel;
private JTextArea textArea;
private JPanel panel_1;
private JPanel panel;
private JTextField textField;
private JPanel panel_2;
private JTextArea txtrTextarea_0;
private JTextArea txtrTextarea_1;
private JPanel panel_3;
private JTextArea txtrTextareasouth;
private JLabel lblNewLabel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Swing_Assignemnt window = new Swing_Assignemnt();
window.frmWindowBuilderAssignment.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Swing_Assignemnt() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmWindowBuilderAssignment = new JFrame();
frmWindowBuilderAssignment.setTitle("Window Builder Assignment");
//frmWindowBuilderAssignment.setBounds(500, 500, 650, 600);
frmWindowBuilderAssignment.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmWindowBuilderAssignment.getContentPane().setLayout(new BorderLayout(0, 0));
frmWindowBuilderAssignment.setVisible(true);
frmWindowBuilderAssignment.setSize(394, 500);
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
//frmWindowBuilderAssignment.pack();
//frmWindowBuilderAssignment.pack();
frmWindowBuilderAssignment.setVisible( true );
panel = new JPanel();
panel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
frmWindowBuilderAssignment.getContentPane().add(panel, BorderLayout.NORTH);
panel.setPreferredSize(new Dimension(200, 40));
panel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
//panel.setBounds(20, 10, 200, 400);
panel.setVisible(true);
JComboBox comboBox = new JComboBox();
panel.add(comboBox);
comboBox.setPreferredSize(new Dimension(125, 20));
comboBox.setVisible(true);
textField = new JTextField();
panel.add(textField);
textField.setColumns(10);
textField.setVisible(true);
panel_2 = new JPanel();
panel_2.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
frmWindowBuilderAssignment.getContentPane().add(panel_2, BorderLayout.CENTER);
panel_2.setLayout(new GridLayout(1, 2, 2, 2));
panel_2.setPreferredSize(new Dimension(200, 400));
panel_2.setVisible(true);
txtrTextarea_0 = new JTextArea();
txtrTextarea_0.setText("textArea_0");
panel_2.add(txtrTextarea_0);
txtrTextarea_0.setPreferredSize(new Dimension(50, 30));
txtrTextarea_0.setVisible(true);
txtrTextarea_1 = new JTextArea();
txtrTextarea_1.setText("textArea_1");
panel_2.add(txtrTextarea_1);
txtrTextarea_1.setVisible(true);
txtrTextarea_1.setPreferredSize(new Dimension(50, 30));
panel_3 = new JPanel();
panel_3.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
frmWindowBuilderAssignment.getContentPane().add(panel_3, BorderLayout.SOUTH);
panel_3.setLayout(new GridLayout(2, 1, 2, 2));
panel_3.setVisible(true);
txtrTextareasouth = new JTextArea();
txtrTextareasouth.setText("textArea_South");
panel_3.add(txtrTextareasouth);
txtrTextareasouth.setVisible(true);
txtrTextareasouth.setPreferredSize(new Dimension(200, 150));
lblNewLabel = new JLabel("Status Label");
panel_3.add(lblNewLabel);
lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
lblNewLabel.setPreferredSize(new Dimension(200, 20));
}
}
На что это похоже:
После некоторых изменений кода, это то, что у меня теперь есть, я не уверен, как изменить размер метки внизу. Он должен быть всего около 15 см в высоту.
Комментарии:
1. Оооо! Mac OS 10.10 Yosemite! Но Swing не соответствует новому внешнему виду.
Ответ №1:
Не используйте setBounds() или setPreferredSize() . Каждый компонент Swing должен определять свой собственный предпочтительный размер, а затем менеджер компоновки будет размещать компоненты на основе правил менеджера компоновки.
Не используйте setVisible (true) для всех ваших компонентов Swing (за исключением JFrame). По умолчанию компоненты Swing видны.
Вы должны добавить все компоненты в фрейм перед использованием:
frame.pack()
frame.setVisible( true );
Ответ №2:
попробуйте использовать
frmWindowBuilderAssignment.pack();
в конце вашего метода инициализации.
Это установит для всех ваших компонентов их предпочтительные размеры и отрегулирует фрейм.