GroupLayout을 사용하여 이상한 동작을 관찰하고 있습니다. JFrame의 크기를 조정하고 다른 구성 요소를 밀어내는 JScrollPane 내부에 포함 된 JTextArea가 있습니다. 이상하게도 레이아웃을 재정렬하면 JTextArea가 위 또는 아래에 아무런 차이가 없으므로 (아무런 간격도 없음) 잘 동작합니다. 마치 텍스트 영역에서 컨테이너에 얼마나 많은 공간이 있는지 묻는 것입니다. 그런 다음 다른 구성 요소와 상관없이 100 % 차지합니다. 또 다른 이상한 점은 JTextArea (JScrollPane 아님) 크기와 컨테이너 내의 다른 컴포넌트 높이가 Short.MAX_VALUE에 도달 할 때만 발생하는 것처럼 보입니다.JTextArea가 GroupLayout의 프레임을 오버플로하는 이유는 무엇입니까?
스크롤 창 (레이아웃에 구성 요소를 추가 할 때)의 세로 그룹에서 최대 크기를 Short.MAX_VALUE보다 작은 값으로 지정하면 문제가 해결되는 것 같습니다. 값과 Short.MAX_VALUE가 다른 기타 구성 요소의 높이보다 큽니다. 예 : 나는 작은 양의 값을 대신 GroupLayout.PREFERRED_SIZE 또는 GroupLayout.DEFAULT_SIZE의 추천 사이즈를 설정하면
.addComponent(textArea, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE - 500)
또한, 또한이 동작은 멀리 갈 수 있도록 보인다. 예 :
.addComponent(textArea, 0, 1, Short.MAX_VALUE)
GroupLayout의 자바 튜토리얼 이에 대해 아무것도 언급하는 것 그리고 사방에 Short.MAX_VALUE에 사용하는 경향하지 않습니다. Google 검색을 사용하여 답변을 찾았지만이 문제를 검색어로 설명하기가 매우 어려웠습니다.
버그를 발견 했습니까? 또는 GroupLayout을 이해하지 못 했습니까? 후자가 분명히 더 많이 보인다.
이 예제는 간단한 텍스트 영역을 만듭니다. 아래쪽 버튼을 눌러 텍스트로 채 웁니다 (그리고 JScrollPane 내부의 JTextArea 크기를 조정합니다). 그런 다음 텍스트 영역 내부를 클릭하고 선을 추가하거나 제거 할 수 있습니다. 추가 선을 추가 한 후 다시 그리기 버튼을 클릭하거나 프레임의 크기를 조절하여 이상한 동작을 확인합니다.
public class GroupLayoutTest {
public GroupLayoutTest() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame("GroupLayout test");
Container panel = frame.getContentPane();
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
JButton addBtn = new JButton("Add Lines");
JButton redrawBtn = new JButton("Redraw");
final JTextArea textArea = new JTextArea();
final JScrollPane textPane = new JScrollPane(textArea);
layout.setHorizontalGroup(layout.createParallelGroup()
.addComponent(redrawBtn)
.addComponent(textPane)
.addComponent(addBtn));
layout.setVerticalGroup(layout.createSequentialGroup()
.addComponent(redrawBtn)
.addComponent(textPane)
.addComponent(addBtn));
addBtn.addActionListener(new ActionListener() {
int m = 0;
@Override
public void actionPerformed(ActionEvent e) {
for (int i = m; m < i + 2044; ++m) {
textArea.append("Line " + m + "\n");
}
// redraw the frame
frame.validate();
}
});
redrawBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.validate();
}
});
frame.setPreferredSize(new Dimension(640, 480));
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static void main(String[] args) {
new GroupLayoutTest();
}
}
1 : 여기
는 (그것은 또한 빌더를 가지고 있지만,이 경우에는 내가 쉽게 열을 걸쳐 셀 제약 조건을 사용하고 있습니다) FormLayout에 어떻게 보일지입니다 sscce.org/ –