将 JButton 添加到 Scrollpane
Adding JButtons to Scrollpane
JAVA:
我想将一些 JButton 添加到 Scrollpane。 JButtons 是聊天(就像在 Skype 中一样)。我希望它们在只有 1 列的列表中。
组/行的数量应该是灵活的。
按钮的大小应该始终相同(300x50 或类似的东西)并且按钮内的文本应该左对齐。
我怎样才能做到这一点?
代码:
class Chat extends JButton {
private static final long serialVersionUID = 1L;
public Group group;
public Chat(Group group) {
this.group = group;
setMinimumSize(new Dimension(300, 50));
setFocusPainted(false);
setText(group.groupname);
setFont(new Font("Tahoma", Font.PLAIN, 30));
setForeground(Manager.dark);
setBackground(blue);
setBorder(new MatteBorder(0, 0, 1, 0, Manager.ct.getForeground()));
}
}
public void initGroups() {
int count = 0;
for(Group group : groups) {
if(group != null) {
//TODO: ADD CHATS (GROUPS) TO SCROLLPANE
count ++;
}
}
if(count == 0) {
System.out.println("No groups");
}
}
创建一个新的 JPanel,设置 GridBadLayout 或 GridLayout 并添加您的聊天按钮。
然后用你的新面板创建一个 JScrollPane。
您可以改进在 JPanel 上实现 Scrollable 的滚动(鼠标滚动)。
首先隔离您需要的功能。从 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
JAVA:
我想将一些 JButton 添加到 Scrollpane。 JButtons 是聊天(就像在 Skype 中一样)。我希望它们在只有 1 列的列表中。 组/行的数量应该是灵活的。 按钮的大小应该始终相同(300x50 或类似的东西)并且按钮内的文本应该左对齐。 我怎样才能做到这一点?
代码:
class Chat extends JButton {
private static final long serialVersionUID = 1L;
public Group group;
public Chat(Group group) {
this.group = group;
setMinimumSize(new Dimension(300, 50));
setFocusPainted(false);
setText(group.groupname);
setFont(new Font("Tahoma", Font.PLAIN, 30));
setForeground(Manager.dark);
setBackground(blue);
setBorder(new MatteBorder(0, 0, 1, 0, Manager.ct.getForeground()));
}
}
public void initGroups() {
int count = 0;
for(Group group : groups) {
if(group != null) {
//TODO: ADD CHATS (GROUPS) TO SCROLLPANE
count ++;
}
}
if(count == 0) {
System.out.println("No groups");
}
}
创建一个新的 JPanel,设置 GridBadLayout 或 GridLayout 并添加您的聊天按钮。 然后用你的新面板创建一个 JScrollPane。 您可以改进在 JPanel 上实现 Scrollable 的滚动(鼠标滚动)。
首先隔离您需要的功能。从 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