JAVA:
我想将一些JButton添加到滚动窗格。 JButton是聊天室(就像在Skype中一样)。我希望它们仅包含1列。 组/行的数量应灵活。 按钮的大小应始终保持相同(300x50或类似大小),并且按钮内的文本应左对齐。 我该如何实现?
代码:
//You will see some Math.Max and Math.Min - these are required because in your comments
//you state the pairs can be out of order (the second value is less than the first)
int upper = int.MinValue;
values = values
//Group all pairs by their minimum value, so (18,30) and (18,27) for example
//would be processed together
.GroupBy(x => Math.Min(x.Item1, x.Item2))
//Sort the groups based on their minimum value, so they can be processed in order.
//Although your example does not require this, the comments say this is required.
.OrderBy(x => x.Key)
//From the group [which may contain (18,30) and (18,27) for example],
//only choose the one with the highest max value. This will choose (18,30)
.Select(x => x.OrderBy(y => Math.Max(y.Item1, y.Item2)).Last())
//Now iterate through the items and throw away the items which are inside
//a pair previously processed pair. We use the upper variable to
//keep track of the greatest processed upper bound to make throwing away
//previously processed pairs easy
.Where(x =>
{
var max = Math.Max(x.Item1, x.Item2);
if (upper < max)
{
upper = max;
return true;
}
else
{
return false;
}
}).ToList();
答案 0 :(得分:1)
首先隔离所需的功能。从JPanel
,GridBagLayout
和一些按钮开始...
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
for (int index = 0; index < 100; index++) {
add(new JButton("Chat " + (index + 1)), gbc);
}
然后将其添加到JScrollPane
并将其添加到主容器中,也许使用BorderLayout
frame.add(new JScrollPane(new ChatListPane()), BorderLayout.LINE_START);
您可能会发现,您可能还需要实现Scrollable
interface
来更好地控制JScrollPane
的大小以更好地满足您的整体需求。当我在这里使用它时,您并不总是需要它...
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ChatPane());
frame.add(new JScrollPane(new ChatListPane()), BorderLayout.LINE_START);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ChatPane extends JPanel {
public ChatPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public class ChatListPane extends JPanel implements Scrollable {
public ChatListPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
for (int index = 0; index < 100; index++) {
add(new JButton("Chat " + (index + 1)), gbc);
}
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(100, 100);
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 64;
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return 64;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return true;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
}
另一个更好的解决方案是使用JList
和自定义ListCellRenderer
。
有关更多详细信息,请参见How to Use Lists
答案 1 :(得分:0)
创建一个新的JPanel,设置GridBadLayout或GridLayout并添加聊天按钮。 然后用新面板创建一个JScrollPane。 您可以在JPanel上实现Scrollable来改善滚动(鼠标滚动)。