Pau*_*tha 1 java graphics swing text java-2d
我正试图将一个字符串集中在一个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
}
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以用来简化这项任务?
例如:
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (currentMessage.equals(message1)) {
removeAll();
// draw String centered (with one line of code)
}
}
Run Code Online (Sandbox Code Playgroud)
看起来我正在为中心文本做很多工作.
试试像......
xCoordinate = (getWidth() - stringWidth) / 2;
yCoordinate = ((getHeight() - fm.getHeight) / 2) + stringAccent;
Run Code Online (Sandbox Code Playgroud)
代替.
此外,您可以使用JLabel
on a JPanel
with a 来实现相同的功能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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1812 次 |
最近记录: |