我正在尝试将一个字符串集中在一个Panel中。
目前我正在这样做:
public void paintComponent(Graphics g) {
super.paintComponent(g);
int stringWidth = 0;
int stringAccent = 0;
int xCoordinate = 0;
int yCoordinate = 0;
// get the FontMetrics for the current font
FontMetrics fm = g.getFontMetrics();
/** display new message */
if (currentMessage.equals(message1)) {
removeAll();
/** Centering the text */
// find the center location to display
stringWidth = fm.stringWidth(message2);
stringAccent = fm.getAscent();
// get the position of the leftmost character in the baseline
xCoordinate = getWidth() / 2 - stringWidth / 2;
yCoordinate = getHeight() / 2 + stringAccent / 2;
// draw String
g.drawString(message2, xCoordinate, yCoordinate);
currentMessage = message2; // alternate message
}
}
我可以使用一种方法来简化此任务吗?
例如:
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (currentMessage.equals(message1)) {
removeAll();
// draw String centered (with one line of code)
}
}
看起来我正在为中心文本做很多工作。
答案 0 :(得分:5)
尝试类似......
xCoordinate = (getWidth() - stringWidth) / 2;
yCoordinate = ((getHeight() - fm.getHeight) / 2) + stringAccent;
相反。
请查看Java center text in rectangle了解更多详情
此外,您可以使用JLabel
上的JPanel
GridBagLayout
来实现相同的目标
<强>更新强>
在removeAll();
中注意到paintComponent
。这不是一个好主意,因为它可能会导致新的重绘请求发布到事件队列,将您的代码放入一个可能消耗CPU的infinte循环......
更新了示例
drawString
和JLabel
的并排比较......(左侧是drawString
,右侧是JLabel
)
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class CenterText {
public static void main(String[] args) {
new CenterText();
}
public CenterText() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(1, 2));
frame.add(new CenterStringPane());
frame.add(new CenterLabelPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class CenterStringPane extends ReferencePane {
public CenterStringPane() {
setFont(UIManager.getFont("Label.font"));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
String text = "In the center";
FontMetrics fm = g2d.getFontMetrics();
int x = (getWidth() - fm.stringWidth(text)) / 2;
int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
g2d.drawString(text, x, y);
g2d.dispose();
}
}
public class CenterLabelPane extends ReferencePane {
public CenterLabelPane() {
setLayout(new GridBagLayout());
add(new JLabel("In the center"));
}
}
public class ReferencePane extends JPanel {
public ReferencePane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int halfX = getWidth() / 2;
int halfY = getHeight() / 2;
g2d.drawLine(halfX, 0, halfX, getHeight());
g2d.drawLine(0, halfY, getWidth(), halfY);
g2d.dispose();
}
}
}
答案 1 :(得分:3)
在java标准库中?不,你可以随时做点什么
private void drawStringMiddleOfPanel(String string, Graphics g) {
String message2 = string;
int stringWidth = 0;
int stringAccent = 0;
int xCoordinate = 0;
int yCoordinate = 0;
// get the FontMetrics for the current font
FontMetrics fm = g.getFontMetrics();
/** display new message */
/** Centering the text */
// find the center location to display
stringWidth = fm.stringWidth(message2);
stringAccent = fm.getAscent();
// get the position of the leftmost character in the baseline
xCoordinate = getWidth() / 2 - stringWidth / 2;
yCoordinate = getHeight() / 2 + stringAccent / 2;
// draw String
g.drawString(message2, xCoordinate, yCoordinate);
currentMessage = message2; // alternate message
}
使用
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (currentMessage.equals(message1)) {
removeAll();
drawStringMiddleOfPanel(message1, g);
}
}
答案 2 :(得分:1)
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (currentMessage.equals(message1)) {
removeAll();
int x= (panel.getWidth() / 2) - str.length()/2;
int y = (panel.getHeight() / 2);
graphics.drawString(str, x, y);
}
}