问题
I have a JScrollPane that show a list of items. I would like the user to be able to scroll through the list if there is not enough space on the screen to show the list and I would like the list to align to the top of the available space if there is more than enough space to show the list. I can do one or the other but can't seem to get both to work. The code shown below accomplishes the goal of allowing the list to be scrollable if the list is larger than the available space but does not align to the top as shown below. I've tried things like putting the JScrollPane in the north section of a borderlayout but when I do this the list is no longer scrollable (i.e. borderlayout gives the scrollpane all of the space it needs and the list is now not scrollable).
Here's what the code below creates:
And here's the code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Example {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(400, 200);
// main panel
JPanel pan = new JPanel();
pan.setLayout(new GridLayout(1, 2));
pan.setBackground(Color.BLUE);
jFrame.getContentPane().add(pan, BorderLayout.CENTER);
jFrame.show();
// left panel
JPanel left = getContentPanel();
left.setBackground(Color.ORANGE);
pan.add(left);
// right panel (with scroll pane)
JPanel right = getContentPanel();
right.setBackground(Color.YELLOW);
JScrollPane scr = new JScrollPane(right);
scr.setBackground(Color.CYAN);
scr.setAlignmentX(JScrollPane.LEFT_ALIGNMENT);
scr.setAlignmentY(JScrollPane.TOP_ALIGNMENT);
pan.add(scr);
}
private static JPanel getContentPanel() {
JPanel rtn = new JPanel();
rtn.setLayout(new GridBagLayout());
GridBagConstraints cs = new GridBagConstraints();
cs.gridx = 0;
cs.weightx = 1;
cs.anchor = GridBagConstraints.NORTHWEST;
for (int i = 0; i < 20; i++) {
JLabel label = new JLabel("Item " + (i + 1));
label.setBackground(Color.DARK_GRAY);
cs.gridy = i;
rtn.add(label, cs);
}
rtn.setBackground(Color.GREEN);
return rtn;
}
}
回答1:
You can use Boxlayout.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Example {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(400, 200);
// main panel
JPanel pan = new JPanel();
pan.setLayout(new GridLayout(1, 2));
pan.setBackground(Color.BLUE);
jFrame.getContentPane().add(pan, BorderLayout.CENTER);
jFrame.show();
// left panel
JPanel left = getContentPanel();
left.setBackground(Color.ORANGE);
pan.add(left);
// right panel (with scroll pane)
JPanel right = getContentPanel();
right.setBackground(Color.YELLOW);
JScrollPane scr = new JScrollPane(right);
scr.setBackground(Color.CYAN);
scr.setAlignmentX(JScrollPane.LEFT_ALIGNMENT);
scr.setAlignmentY(JScrollPane.TOP_ALIGNMENT);
pan.add(scr);
}
private static JPanel getContentPanel() {
JPanel rtn = new JPanel();
rtn.setLayout(new BoxLayout(rtn, BoxLayout.Y_AXIS));
for (int i = 0; i < 20; i++) {
JLabel label = new JLabel("Item " + (i + 1));
label.setBackground(Color.DARK_GRAY);
rtn.add(label);
}
rtn.add(Box.createVerticalGlue());
rtn.setBackground(Color.GREEN);
return rtn;
}
}
来源:https://stackoverflow.com/questions/35941320/jscrollpane-doesnt-top-align-when-there-is-more-than-enough-space-to-show-the-c