[英]Drawing text using Swing
主要問題是我想繪制一些帶有幾個標簽的圖表。 對於繪圖我使用以下類:
public class Canvas extends JPanel {
// Lot of other methods
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// Other code
g2.setColor(Style.LIGHT_GREY);
g2.fillOval(node.getPosition().x, node.getPosition().y, Style.SHAPE_SIZE, Style.SHAPE_SIZE);
g2.setColor(Style.DARK_GREY);
g2.setStroke(new BasicStroke(1.5f));
g2.drawOval(node.getPosition().x, node.getPosition().y, Style.SHAPE_SIZE, Style.SHAPE_SIZE);
//Draw token
g2.setColor(Style.DARK_GREY);
g2.setFont(new Font("Monospaced", Font.PLAIN, 12));
String token = ((Place)node).getTokens().toString();
g2.drawString(token,
(int) (node.getNodeCenterPosition().x - 3.5*token.length()), node.getNodeCenterPosition().y + CHAR_HEIGHT);
//Draw label
g2.drawString("P1", node.getPosition().x-8, node.getPosition().y-8);
// More code
}
}
沒關系坐標,它們都設置正確。 奇怪的行為從最后的drawString開始:
//Draw label
g2.drawString("P1", node.getPosition().x-8, node.getPosition().y-8);
一旦調用了paintComponent
就會渲染所有以前的代碼。 雖然如果我再次觸發paintComponent
(從外部調用canvas.repaint()
)它將顯示出來。
這是第一次重繪后畫布的狀態:
這是第二次重繪后畫布的狀態:
附加說明:如果我將標簽放在光盤的右側,它會在第一次重繪時正常渲染:
g2.drawString("P1", node.getPosition().x+50, node.getPosition().y+30);
代碼的位置對行為沒有影響。 如果我注釋掉所有代碼但標簽,或者我將標簽繪圖放在函數的頂部,則沒有任何區別。
那么,我怎么能在第一次調用重繪時渲染這個標簽?
編輯 :這是呈現窗口的代碼:
public class MainWindow extends JFrame {
private MainWindow() {
super();
setVisible(true);
setResizable(false);
setSize(1280, 750);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout());
this.setJMenuBar(MainMenu.getInstance());
add(Canvas.getInstance(), BorderLayout.CENTER);
add(ToolBar.getInstance(), BorderLayout.PAGE_START);
add(LeftPanel.getInstance(), BorderLayout.LINE_START);
}
}
和Canvas'構造函數中的代碼:
private Canvas() {
super();
this.setFocusable(true);
this.setBackground(Style.BACKGROUND);
this.popupNewNode = new JPopupMenu();
this.popupNewNode.setFocusable(false);
this.newPlace = new JMenuItem("New Place");
this.newTransition = new JMenuItem("New Transition");
this.popupNewNode.add(newPlace);
this.popupNewNode.add(newTransition);
}
畫布和其他一些組件是單例,但我認為這不應該是一個問題,因為只有一個窗口存在,其中有一個畫布。
沒有完全可運行的示例很難知道,但是,您不應該對文本的大小做出假設,而應該使用FontMetrics
FontMetrics fm = g.getFontMetrics();
int width = fm.stringWidth("P1");
int height = fm.getHeight();
g.drawString("P1", node.getPosition().x - width, (node.getPosition().y - height) + fm.getAscent());
仔細查看使用Text API獲取更多詳細信息。
另一個問題可能是,如果您之前已經翻譯了Graphics
上下文而沒有先復制它或撤消翻譯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.