Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
int labelsWidth=150;
getContentPane().setLayout(new AbsoluteLayout());
getContentPane().add(jLabel1, new AbsoluteConstraints(0, 8, 100, -1));
getContentPane().add(jTextField1, new AbsoluteConstraints(110, 8, 100, -1));
layoutless
.item(new ComponentBox()
.component(jTextField1)
.width(layoutless.width().minus(labelsWidth).minus(16))
.height(22)
.x(labelsWidth+8)
.y(8+25*0)
)
FormLayout layout = new FormLayout(
"max(60dlu;p), 3dlu, p:grow", // columns
"p, 3dlu, p, 3dlu, p" // rows
);
CellConstraints cc = new CellConstraints();
builder.add(jTextField1, cc.xy(3, 1));
.item(new ComponentBox()
.component(jTextField1)
.width(layoutless.width().minus(labelsWidth).minus(16)<b>.minus(50)</b>)
.height(22)
.x(labelsWidth+8)
.y(8+25*0)
)
protected Control createDialogArea(Composite parent) {
final Composite area = (Composite) super.createDialogArea(parent);
((GridLayout) area.getLayout()).numColumns = 2;
GridDataFactory gdf = GridDataFactory.fillDefaults()
.hint(200, SWT.DEFAULT);
new Label(area, SWT.NONE).setText("Label 1");
text1 = new Text(area, SWT.SINGLE | SWT.BORDER);
text1.setText("Text 1");
gdf.applyTo(text1);
new Label(area, SWT.NONE).setText("Label 2");
text2 = new Text(area, SWT.SINGLE | SWT.BORDER);
text2.setText("Text 2");
gdf.applyTo(text2);
new Label(area, SWT.NONE).setText("Long label 3");
text3 = new Text(area, SWT.PASSWORD | SWT.BORDER);
text3.setText("Password");
gdf.applyTo(text3);
return area;
}

Код формы из первого скриншота выглядит так:Это ужасно. Ужасно неудобно, нечитаемо и неподдерживаемо, имхо. Даже по сравнению с длиннющими портянками GridBag-конструкторов. Не вижу ни одного преимущества перед классическими layout-ами, при том, что явные недостатки (описанные выше) налицо, особенно про «поплывёт», от чего layout-ы, собственно, призваны спасать. В вашем же случае получается по факту реально то же самое, только надо в голове разруливать зависимости расположений элементов относительно друг друга, да ещё и в абсолютных значениях каких-то.
Если кто-то считает что знает компоновщик позволяющий для такой небольшой формы сделать более простой и читабельный код (см. текст исходника)Лично я не считаю это простым и читабельным кодом. Потому, что код для описания раскладки не должен быть таким. ИМХО, опять же. А вообще, это просто субъективные вещи всё. Вам не нравится как выглядит работа с классическими layout-ами и вы написали велосипед. Больше нет причин искать подобные альтернативы) А мне механизм лаяутов в java очень нравится удобством и гибкостью.
frame.add( new JLabel(new ImageIcon(new URL(ICON_URL))), new GridBagConstraints( 0, 0, 1, 4, 0.0, 0.0, GridBagConstraints.SOUTH, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0 ) );
frame.add( new JLabel("jLabel1"), new GridBagConstraints( 1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0 ) );
frame.add( new JTextField("jTextField1",10), new GridBagConstraints( 2, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0, 0 ) );
frame.add( new JButton( "..." ), new GridBagConstraints( 3, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0 ) );
frame.add( new JLabel("jLabel2"), new GridBagConstraints( 1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0 ) );
frame.add( new JTextField("jTextField2",10), new GridBagConstraints( 2, 1, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0, 0 ) );
frame.add( new JLabel("jLabel3"), new GridBagConstraints( 1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0 ) );
frame.add( new JPasswordField("jTextField3",10), new GridBagConstraints( 2, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0 ) );
frame.add( new JButton("jButton1"), new GridBagConstraints( 2, 3, 2, 1, 0.0, 1.0, GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0 ) );
Результат:
является ли первый вариант более читабельным и локаничным чем второй?Да ну уж, прямо. В чём разница особая? По количеству кода или его содержанию никакой разницы нету. Вы просто пытаетесь выставить своё сугубо субъективное недовольство layout выставить как несомненную проблему swing-layout. Несмотря на то, что тысячи java-разработчиков кайфуют от именно такого, как им кажется, удобного механизма. И выше вам на это же явно указали другие юзеры. Я с ними соглашаюсь. Лаяуты в swing реализованы очень удобно и существуют на любой вкус и цвет, плюс возможность писать свои (тут вообще бесконечная гибкость потенциально). Поймите, это не значит, что ваш способ совсем гадкий или что-то типа такого. Это просто ваш личный велосипед, который удобен только вам, вот и всё.
Ну и сам собой напрашивается ответ — да это пистец какой-то. Вообще ничего невозможно разобрать.
JPanel panel = new JPanel( new MigLayout("fillx", "60[150]5[]0", "0[]7[]7[]push[]0")
panel.add( label1 );
panel.add( field1, "growx, split" );
panel.add( browse, "wrap );
panel.add( label2 );
panel.add( field2, "wrap" );
panel.add( label3 );
panel.add( field3, "wrap" );
panel.add( button1, "skip");

JPanel pnl = new JPanel(new MigLayout(""));
CC tfConstraints = new CC().growX().width("100%").wrap();
pnl.add(new Label("label1"));
pnl.add(new JTextField(), tfConstraints);
pnl.add(new Label("label2"));
pnl.add(new JTextField(), tfConstraints);
pnl.add(new Label("label3"));
pnl.add(new JTextField(), tfConstraints);
pnl.add(new JButton("button1"), new CC().skip());
pnl.add(new JLabel("absolute"), new CC().pos("0","0"));
JPanel pnl = new JPanel(new MigLayout());
CC labelConstraints = new CC().gap("100lp");
pnl.add(new Label("label1"), labelConstraints);
pnl.add(new JTextField(), new CC().growX().width("100%").split().sizeGroupY("tfHeight"));
pnl.add(new JButton("..."), new CC().wrap().height("0!").sizeGroupY("tfHeight"));
pnl.add(new Label("label2"), labelConstraints);
pnl.add(new JTextField(), new CC().growX().width("100%").wrap());
pnl.add(new Label("label3"), labelConstraints);
pnl.add(new JPasswordField(), new CC().width("200lp").wrap());
pnl.add(new JButton("button1"), new CC().skip().pushY().alignY("bottom"));
pnl.add(new JLabel(new ImageIcon(new URL(ICON_URL))), new CC().pos("0",null,null,"100%"));

Layout без layout'ов