以下是我的代碼。
我認為點擊按鈕,至少,一個 Color.CYAN 塊將被添加到 MainPanel 中,但它沒有。
你能告訴我如何實作嗎?謝謝。
public class TestFrame extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
final TestFrame mainFrame = new TestFrame();
mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
mainFrame.setVisible(true);
});
}
public TestFrame() throws HeadlessException {
setTitle("Frame");
setSize(new Dimension(1000, 800));
final JPanel mainPanel = new JPanel();
final JButton button = new JButton("Test");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
mainPanel.add(new Unit());
}
});
mainPanel.add(button);
mainPanel.revalidate();
add(mainPanel);
}
class Unit extends JComponent {
public Unit() {
setSize(new Dimension(100, 100));
setBackground(Color.CYAN);
}
@Override
protected void paintComponent(Graphics g) {
final Graphics2D g2D = (Graphics2D) g;
g2D.drawString("Hello World", 10, 10);
}
}
}
uj5u.com熱心網友回復:
您的 Unit JComponent 可能會被添加到 ActionListener 中的 mainPanel 中,因此是 GUI,但它沒有首選大小,因此根據 JPanel 使用的 FlowLayout,它將大小為 [0, 0]。FlowLayouts(和大多數布局管理器)不考慮組件的大小,而是考慮它的 preferredSize。此外,revalidate()并repaint()需要在容器(mainPanel中)在單位已經加入,使得布局管理器可以做他們的組件布局,并允許作業系統明確臟像素后呼叫。
為了解決這個問題,給它一個首選的大小,最好是通過覆寫public Dimension getPreferredSize()但setPreferredSize(...)如果你必須呼叫,revalidate()并repaint()在將組件添加到容器之后呼叫和。
更好的是,使用CardLayout 教程將組件添加到容器中,但通過添加一個空的 JLabel 來隱藏它,再次使用 CardLayout,然后通過CardLayout.show(...)從 ActionListener 中呼叫來顯示隱藏的組件。
旁注:不要忘記繪畫方法中的超級方法:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // add this ****
final Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2D.setFont(UNIT_FONT);
g2D.drawString("Hello World", textX, textY);
}
否則,您會破壞繪畫鏈,并可能會看到不需要的偽影或其他問題
例如,
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class TestFrame extends JFrame {
private CardLayout cardLayout = new CardLayout();
private JPanel cardPanel = new JPanel(cardLayout);
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
final TestFrame mainFrame = new TestFrame();
mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
mainFrame.pack();
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible(true);
});
}
public TestFrame() throws HeadlessException {
setTitle("Frame");
setPreferredSize(new Dimension(1000, 800));
final JPanel mainPanel = new JPanel(new BorderLayout());
final JButton button = new JButton("Test");
button.addActionListener(e -> {
cardLayout.next(cardPanel);
});
JPanel btnPanel = new JPanel();
btnPanel.add(button);
mainPanel.add(btnPanel, BorderLayout.PAGE_END);
mainPanel.add(cardPanel);
add(mainPanel);
cardPanel.add(new JLabel(), "Foo");
cardPanel.add(new Unit(), Unit.class.getCanonicalName());
}
static class Unit extends JPanel {
private static final int PREF_W = 100;
private static final int PREF_H = 100;
private static final Font UNIT_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 60);
public Unit() {
setBackground(Color.CYAN);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
final Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2D.setFont(UNIT_FONT);
g2D.drawString("Hello World", 360, 350);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/371766.html
上一篇:在paintComponent中Graphics2D完成繪畫后是否可以獲得自適應寬度和高度?
下一篇:在Swing中繪制超級擁擠的點
