스윙 응용 프로그램에서 구성 요소의 크기를 조정하기 위해 setXXXSize() 메서드를 사용하지 않으려면이 포럼 (예 :)에서 몇 가지 답변 된 질문을 읽었습니다.JScrollPane의 크기를 조정하는 모범 사례
그래서 내 문제가 생기면 JScrollPane의 크기를 조절하지 않고 크기를 늘릴 수 없도록 JScrollPane의 크기를 조정하는 방법을 알고 싶습니다.
일부 코드를 작성하기 전에 "장난감 예제"를 게시 할 것이므로 실제 상황을 설명하고 싶습니다.
내 JFrame에서 현재 콘텐츠 창에 테두리 레이아웃을 사용하고 있습니다. BorderLayout.CENTER에는 사용자 정의 페인팅을 수행하는 JPanel이 있습니다. BorderLayout.EAST에는 다른 패널 (이 패널은 BorderLayout.NORTH의 eastPanel에 추가됩니다) 및 JTable (BorderLayout.CENTER의 eastPanel에 추가됨)을 포함하는 JScrollPane에 포함 된 일부 구성 요소를 포함하는 JPanel (eastPanel)이 있습니다. 이 테이블에는 많은 행이 있습니다. eastPanel의 높이가 centerPanel의 높이와 같기 때문에 JScrollPane이 가능한 한 많은 행을 표시하려고 크기를 늘리지 않도록하는 방법이 필요합니다.
지금은 scrollpane이 포함 된 eastPanel에서 setPreferredSize를 호출하는 것과는 다른 솔루션을 찾을 수 없었지만이 솔루션을 싫어한다는 것을 인정해야합니다. 내 목적은 코드의 간단한 예제를 게시 할 때부터
이 코드 샘플에서 샘플 코드
나는, eastPanel의 북쪽과 JScrollPane의 내부에 어떤 임의의 레이블을 추가했다. 그러나 상황은 위에서 설명한 것과 매우 유사합니다. 나는이 코드 "끔찍한"라인을 사용하지 않고 내 문제를 해결할 수 없습니다 :
eastPanel.setPreferredSize(new Dimension(eastPanel.getPreferredSize().width, centerPanel.getPreferredSize().height));
내가 이런 간단한 상황에 더 복잡한 레이아웃을 피하기 위해 싶습니다. 내가 놓친 게 있니? 또한, 빈 경계를 허용할만한 방법으로 패널의 크기를 설정하여 사용자 정의 페인팅을 수행 할 것인가를 설정하고 있습니까?
코드 : 당신의 도움에 대한
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class Test
{
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new TestFrame().setVisible(true);
}
catch(Exception exception) {
JOptionPane.showMessageDialog(null, "Fatal error while initialiing application", "Error", JOptionPane.ERROR_MESSAGE);
}
}
});
}
}
class TestFrame extends JFrame
{
public TestFrame() {
super("Test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel pane = new JPanel(new BorderLayout(20, 0));
pane.setBorder(new EmptyBorder(20, 20, 20, 20));
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.WHITE);
centerPanel.setBorder(new EmptyBorder(400, 400, 0, 0));
// centerPanel.setPreferredSize(new Dimension(400, 400));
JPanel eastPanel = new JPanel(new BorderLayout(0, 20));
JPanel labelsContainer = new JPanel(new GridLayout(0, 1));
for(int i=0;i<7;i++) labelsContainer.add(new JLabel(String.valueOf(i)));
eastPanel.add(labelsContainer, BorderLayout.NORTH);
JPanel moreLabelsContainer = new JPanel(new GridLayout(0, 1));
for(int i=7;i<70;i++) moreLabelsContainer.add(new JLabel(String.valueOf(i)));
JScrollPane scroll = new JScrollPane(moreLabelsContainer, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
eastPanel.add(scroll, BorderLayout.CENTER);
eastPanel.setPreferredSize(new Dimension(eastPanel.getPreferredSize().width, centerPanel.getPreferredSize().height));
pane.add(centerPanel, BorderLayout.CENTER);
pane.add(eastPanel, BorderLayout.EAST);
setContentPane(pane);
pack();
setLocationRelativeTo(null);
}
}
감사합니다!
답변 해 주셔서 감사합니다. 일부 게시물을 읽고 내가 잘못 생각, setPreferredSize 너무 "악마"로 간주되면, getPreferredSize 메서드를 재정의하는 것이 훨씬 더 좋을 않았을. 나는 당신 같은 전문 사용자로부터이 팁을 받게되어 기쁩니다! 감사합니다, 그리고 나쁜 영어로 유감 : D – Ansharja