我想设置上方和下方 JButton
的图标。目前,为了实现这一点,我覆盖布局管理器并使用三个JLabel
实例(即2个用于文本,1个用于图标)。但这似乎是一个肮脏的解决方案。
有更直接的方法吗?
注意 - 我不是在寻找多行解决方案,我正在寻找一个多标签解决方案。虽然this文章将其称为多行解决方案,但它实际上似乎是指多标签解决方案。
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public final class JButtonDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI(){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.add(new JMultiLabelButton());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static final class JMultiLabelButton extends JButton
{
private static final long serialVersionUID = 7650993517602360268L;
public JMultiLabelButton()
{
super();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(new JCenterLabel("Top Label"));
add(new JCenterLabel(UIManager.getIcon("OptionPane.informationIcon")));
add(new JCenterLabel("Bottom Label"));
}
}
private static final class JCenterLabel extends JLabel
{
private static final long serialVersionUID = 5502066664726732298L;
public JCenterLabel(final String s)
{
super(s);
setAlignmentX(Component.CENTER_ALIGNMENT);
}
public JCenterLabel(final Icon i)
{
super(i);
setAlignmentX(Component.CENTER_ALIGNMENT);
}
}
}
答案 0 :(得分:5)
无法在JButton的顶部/底部之间拆分文本。这将涉及定制绘画。
由于我不确定您的确切要求,我只会提出一些随意的想法:
您可以将JButton与text&图标。 API中有一些方法允许您控制文本相对于图标的位置。那么你需要另一个标签用于另一行文本。基本上与您当前的解决方案相同,但您只需要两个标签。
您可以使用Text Icon和Compound Icon类从3个单独的图标中创建1个图标。然后,您只需将图标添加到按钮即可。
使用JTextPane。它支持insertIcon()方法。因此,您可以添加一行文本,添加图标,然后添加另一行文本。如果您不希望文本左对齐,则可以使用文本窗格的段落属性来在文本窗格内水平对齐文本。您还可以使用背景颜色使其看起来像标签。
使用CompoundIcon的示例:
import java.awt.*;
import javax.swing.*;
public final class JButtonDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JButton button = new JButton();
CompoundIcon icon = new CompoundIcon(CompoundIcon.Axis.Y_AXIS,
new TextIcon(button, "Top Label"),
UIManager.getIcon("OptionPane.informationIcon"),
new TextIcon(button, "Bottom Label"));
button.setIcon( icon );
button.setFocusPainted( false );
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.add( button );
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
答案 1 :(得分:2)
你有两个选择
1)使用JLabel + Icon + Html(< = Html 3.2)
2)使用XxxButtonUI并覆盖所有必需的methods from API
3)具有半透明度的JLayeredPane ???,另一种具有半透明度的布局,作为JButton的JLabel或JComponent,
4)有大量的Graphics SW可以为Icon准备背景为* .jpg,然后根据事件,动作或JButton的实际设置更改任何内容
不正确的方法是寻找JLabel + Whatever而不是JButton,我认为这是半衰期的解决方法
答案 2 :(得分:-1)
在此处找到另一个LayoutManager
:http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html