У меня есть JPanel
с GridBagLayout
в качестве менеджера по расположению, и я пытаюсь получить это расположение:
![https://i.stack.imgur.com/ZZmVH.png](https://i.stack.imgur.com/ZZmVH.png)
Игнорироватьдополнительное темно-синее пространство границы.
У меня есть в общей сложности 5 столбцов и 3 строки, и для всех компонентов setPreferredSize()
установлено на точное значение, чтобы идеально поместиться в JPanel
, который также имеет предпочтительный размер(170 x 115).
Проблема заключается в том, что GridBagLayout
, по-видимому, добавляет 30 пикселов к ширине последнего столбца, поскольку только добавление 30 пикселов к ширине JPanel
(всего 200)компоненты отображаются правильно, например:
![https://i.stack.imgur.com/GzjDz.png](https://i.stack.imgur.com/GzjDz.png)
, но последний столбец отделен из-за дополнительного пробела.
Добавляется 30pxls, потому что добавление 29 pxls к ширине JPanel дает такой результат:
![https://i.stack.imgur.com/tdmYI.png](https://i.stack.imgur.com/tdmYI.png)
, который, по моему опыту, говорит о том, что доступное пространство слишком мало, чтобы показать все компонентыа затем использует setMinimumSize()
.
Я не знаю, откуда взялись эти 30 пикселей, пожалуйстаМожет кто-нибудь сказать мне, как сделать компоненты подходят?
Код показан ниже и в настоящее время дает этот результат:
![https://i.stack.imgur.com/p77am.png](https://i.stack.imgur.com/p77am.png)
Игнорироватьдополнительное черное пространство JFrame
.
Вы можете изменить ширину JPanel
в строке 34.
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class Test{
public static void main (String[] args){
JFrame f;
SizeProperties p;
f = new JFrame();
p = new SizeProperties();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setPreferredSize(new Dimension(250,200));
f.getContentPane().setBackground(Color.BLACK);
f.setLayout(new FlowLayout());
f.add(p);
f.pack();
f.setVisible(true);
}
}
final class SizeProperties extends JPanel{
private GridBagConstraints c;
private PropertiesLabel xL,yL,wL,hL;
private PropertiesField xF,yF,wF,hF;
private ProportionToggleButton ptb;
SizeProperties(){
setBackground(new Color(18,101,142));
setPreferredSize(new Dimension(170,115));//Change width here
setLayout(new GridBagLayout());
xL = new PropertiesLabel("x:",25,25);
xF = new PropertiesField();
yL = new PropertiesLabel("y:",25,25);
yF = new PropertiesField();
wL = new PropertiesLabel("Width:",80,25);
wF = new PropertiesField();
hL = new PropertiesLabel("Height:",80,25);
hF = new PropertiesField();
ptb = new ProportionToggleButton();
c = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,0),0,0);
add(xL,c);
c = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
add(xF,c);
c = new GridBagConstraints(2,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,0),0,0);
add(yL,c);
c = new GridBagConstraints(3,0,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
add(yF,c);
c = new GridBagConstraints(0,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
add(wL,c);
c = new GridBagConstraints(2,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(wF,c);
c = new GridBagConstraints(0,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
add(hL,c);
c = new GridBagConstraints(2,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(hF,c);
c = new GridBagConstraints(4,1,1,2,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(ptb,c);
}
}
final class PropertiesLabel extends JLabel{
PropertiesLabel(String label,int w,int h){
setText(label);
setPreferredSize(new Dimension(w,h));
setBackground(Color.BLACK);
setOpaque(true);
setForeground(Color.WHITE);
setFont(new Font("SansSerif",Font.PLAIN,14));
setHorizontalAlignment(SwingConstants.CENTER);
setVerticalAlignment(SwingConstants.CENTER);
}
}
final class PropertiesField extends JTextField{
private int validNumber = 0;
PropertiesField(){
setPreferredSize(new Dimension(45,25));
setBackground(new Color(202,226,255));
setForeground(Color.BLACK);
setFont(new Font("SansSerif",Font.PLAIN,14));
setHorizontalAlignment(JTextField.CENTER);
setText("999");
}
}
final class ProportionToggleButton extends JToggleButton{
ProportionToggleButton(){
setPreferredSize(new Dimension(15,60));
}
}
Заранее спасибо.