Я тестирую объединение JPanel (элементы управления) и JTable (данные) в одном кадре и столкнулся с проблемами при попытке изменить размер JFrame, который их содержит.
Первая проблема, с которой я столкнулся, заключается в том, чтоframe.setMinimumSize(new Dimension (frame.getSize())) в Windows 10 не работает. Это позволяет пользователю уменьшить размер кадра вдвое. (Раскомментируйте эту строку кода, чтобы увидеть поведение). Затем я попытался реализовать свой собственный, и метод checkSize(); работает для установки правильного минимального размера. Однако я не могу получить событие «окончание изменения размера» для вызова checkSize(), и в результате у меня получается неправильное окно минимального размера. Я пробовал ComponentListener, HierarchyBoundsListener и MouseListener, ни один из них не работает. Кажется, что отпускание мыши всегда отменяет последнюю настройку размера checkSize(). Есть ли способ преодолеть это?
Не будучи самым опытным программистом Java Swing, вторая проблема, с которой я сталкиваюсь, — это попытка заставить JTable и JPanel изменять размер при увеличении кадра. размер. Когда я увеличиваю размер кадра с помощью мыши, JTable и JPanel остаются одинакового размера в центре кадра. Я бы хотел, чтобы элемент управления JPanel оставался закрепленным в левом верхнем углу и рос только по горизонтали или не рос вообще, а JTable рос и заполнял остальную часть кадра как по горизонтали, так и по вертикали. Как мне этого добиться?
Проверьте код ниже.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.HierarchyBoundsListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Table extends JPanel
{
private JTextField DCFileName = new JTextField (10);
public JTextField DChours = new JTextField (5);
JFrame frame = new JFrame();
Dimension d;
public Table()
{
super(new GridBagLayout());
//setLayout(new BorderLayout());
//headers for the table
String[] columns = new String[] {
"Id", "Name", "Hourly Rate", "Part Time"
};
//actual data for the table in a 2d array
Object[][] data = new Object[30][5];
for ( int i=0;i0.5?true:false;
}
//create table with data
JTable table = new JTable(data, columns);
//add the table to the frame
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
//Add the control row
add(setupControl(), gbc);
//add(setupControl());
gbc.gridy = 1;
gbc.weighty = 1;
//Add the table below
add(new JScrollPane(table), gbc);
frame.setTitle("Table Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.addComponentListener(new FrameListen());
// frame.addMouseListener(new MouseListen());
frame.pack();
// frame.setMinimumSize(new Dimension (frame.getSize()));
d = frame.getSize();
/*frame.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsListener(){
@Override
public void ancestorMoved(HierarchyEvent e) {
checkSize();
}
@Override
public void ancestorResized(HierarchyEvent e) {
}
}); */
System.out.println("Size " + d.getWidth() + " " + d.getHeight());
frame.setVisible(true);
}
private JPanel setupControl() {
JPanel control = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
control.add(MakeTextField (" Rows of Data to Send", JTextField.LEFT) ,gbc);
gbc.gridy = 1;
control.add(DChours, gbc);
DChours.setEditable(true);
DChours.setText("10");
gbc.gridy = 0;
gbc.gridx = 1;
control.add(MakeTextField (" Data input file", JTextField.LEFT) ,gbc);
gbc.gridy = 1;
DCFileName.setEditable(false);
control.add(DCFileName, gbc);
DCFileName.setText("Input file");
return control;
}
private JTextField MakeTextField(String label, int alignment) {
return MakeTextField ( label, label.length(), alignment );
}
private JTextField MakeTextField(String label, int length, int alignment) {
length = (int) (length * 0.8);
JTextField tf = new JTextField(length);
tf.setText(label);
tf.setEditable(false);
tf.setHorizontalAlignment(alignment);
tf.setBorder(javax.swing.BorderFactory.createEmptyBorder());
return tf;
}
private class MouseListen implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("Mouse clicked" );
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Mouse pressed" );
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("Mouse released" );
checkSize();
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse enter" );
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse exit" );
}
}
private class FrameListen implements ComponentListener{
@Override
public void componentResized(ComponentEvent e) {
checkSize();
}
@Override
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
}
private void checkSize() {
Dimension d2 = frame.getSize();
boolean resize = false;
if (d2.getWidth() < d.getWidth()) {
d2.setSize(d.getWidth(), d2.getHeight());
resize = true;
}
if (d2.getHeight() < d.getHeight()) {
d2.setSize(d2.getWidth(), d.getHeight());
resize = true;
}
if ( resize ) frame.setSize(d2);
System.out.println("Size " + d2.getWidth() + " " + d2.getHeight() + " " + resize);
return;
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Table();
}
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... dbaglayout
Изменение размера проблем JFrame с помощью JPanel и JTable с использованием GridBagLayout ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Изменение размера проблем JFrame с помощью JPanel и JTable с использованием GridBagLayout
Anonymous » » в форуме JAVA - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Изменение размера проблем JFrame с помощью JPanel и JTable с использованием GridBagLayout
Anonymous » » в форуме JAVA - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-