我正在尝试弄清楚如何对齐 JButton 中的一些文本,但它似乎比我想象的更具挑战性。在某些方面,我曾尝试使用 HTML 和 JLabel,但没有成功。我想做的是,我想模拟一个键盘键,字母居中,右上角有一个数字。
JPanel panel = new JPanel();
LayoutManager layout = new FlowLayout();
panel.setLayout(layout);
String htmlContent = "<html><font align=right>10</font><br><center><font width=100>Some text<font></center><br><font height=20></font></html>";
String secondContent = "<html><sup>HTML</sup><br><font>Multi-line</font>";
JButton nextButton = new JButton(htmlContent);
nextButton.setForeground(new Color(0x000000));
nextButton.setBackground(new Color(0xffffff));
nextButton.setBorderPainted(false);
nextButton.setFocusPainted(false);
nextButton.setBounds(0, 0, 30, 25);
nextButton.setBorder(new RoundedBorder(10)); //10 is the radius
panel.add(nextButton);
JButton secondButton = new JButton(secondContent);
secondButton.setForeground(new Color(0xffffff));
secondButton.setBackground(new Color(0x0062ff));
secondButton.setBorderPainted(false);
secondButton.setFocusPainted(false);
panel.add(secondButton);
JLabel firstLabel = new JLabel("First");
firstLabel.setHorizontalTextPosition(JLabel.RIGHT);
firstLabel.setVerticalTextPosition(JLabel.TOP);
firstLabel.setSize(150,100);
JLabel secondLabel = new JLabel("So much text");
secondLabel.setHorizontalTextPosition(JLabel.CENTER);
secondLabel.setVerticalTextPosition(JLabel.CENTER);
secondLabel.setSize(100,100);
JButton thirdBtn = new JButton();
thirdBtn.setForeground(new Color(0x000000));
thirdBtn.setBackground(new Color(0xbdbdbd));
thirdBtn.setBorderPainted(false);
thirdBtn.setFocusPainted(false);
thirdBtn.add(firstLabel);
thirdBtn.add(secondLabel);
thirdBtn.setPreferredSize(new Dimension(200, 80));
panel.add(thirdBtn);
frame.getContentPane().add(panel, BorderLayout.CENTER);
到目前为止,这是我尝试用来实现此目的的代码,但我看不到我需要的结果,只是无法将文本右对齐或使其流向那里。还尝试使用双标签按钮,似乎标签无法相互对齐。有办法吗?
附言忘了说,曾尝试在 HTML 标签中使用 align=right 或 align='right' 或只是 'right',但这些都不起作用
结果:
Oracle 有一个有用的教程,Creating a GUI With Swing。跳过使用 NetBeans IDE 学习 Swing 部分。特别注意执行自定义绘画部分。
正如我在评论中所说,为什么不创建一个图像并将图像放在
JButton
.
这是我想出的 GUI。
要为您的所有
JButtons
创建图像,只需循环调用图像创建方法即可。
这是完整的可运行代码。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class JButtonImageExample implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new JButtonImageExample());
}
private BufferedImage image;
public JButtonImageExample() {
Font font = new Font(Font.DIALOG, Font.PLAIN, 36);
this.image = createLetterImage(70, 70, font, 'G', 7);
}
@Override
public void run() {
JFrame frame = new JFrame("Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createButtonPanel(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createButtonPanel() {
JPanel panel = new JPanel(new FlowLayout());
panel.setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));
JButton button = new JButton(new ImageIcon(image));
panel.add(button);
return panel;
}
private BufferedImage createLetterImage(int width, int height, Font font,
char letter, int value) {
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) image.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setFont(font);
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.BLACK);
String s = Character.toString(letter);
Rectangle rect = new Rectangle(0, 0, width, height);
drawCenteredString(g2d, s, rect, font);
g2d.setColor(Color.BLUE);
s = Integer.toString(value);
drawRightAlignedString(g2d, s, width, font);
g2d.dispose();
return image;
}
private void drawRightAlignedString(Graphics2D g2d, String text, int width,
Font font) {
int pointSize = font.getSize() / 2;
g2d.setFont(font.deriveFont((float) pointSize));
FontMetrics metrics = g2d.getFontMetrics(g2d.getFont());
int margin = 2;
int x = width - metrics.stringWidth(text) - margin;
int y = metrics.getAscent() - margin;
g2d.drawString(text, x, y);
}
private void drawCenteredString(Graphics2D g2d, String text, Rectangle rect,
Font font) {
FontMetrics metrics = g2d.getFontMetrics(font);
int x = rect.x + (rect.width - metrics.stringWidth(text)) / 2;
int y = rect.y + ((rect.height - metrics.getHeight()) / 2)
+ metrics.getAscent();
g2d.setFont(font);
g2d.drawString(text, x, y);
}
}
我认为用 Java Graphics 绘制自己的 JButton 更好。如果你这样做,你可以很容易地做到这一点。 这里是关于 Java 图形和图形 2D 的 Oracle 文档