[英]JTextField doesn't show when the Paint method is overridden
我正在用Java語言編寫一個簡單的顏色選擇器,並添加了一些JTextFields
以獲取用戶輸入。 我將文本字段添加到JPanel
,但是由於某些原因,當我覆蓋paint方法時,它們不會出現。 但是,當我在不覆蓋paint方法的情況下運行該程序時,將顯示文本字段。 我知道它們的存在,因為當我將鼠標懸停在它們上方時,光標會發生變化,並且如果添加工具提示文本,它也會顯示出來。 如何顯示文本字段? 這是代碼:
public class ColorSlider extends JPanel {
private ColorChooser parent;
private int sliderX = 0;
private JTextField textField = new JTextField();
public ColorSlider(ColorChooser parent, int x, int y, String toolTip) {
this.parent = parent;
parent.add(this);
setBounds(x, y, 96, 16);
setVisible(true);
setOpaque(false);
setFocusable(true);
addMouseListener(this);
addMouseMotionListener(this);
setToolTipText(toolTip);
setLayout(null);
textField.setBounds(80, 0, 16, 16); // Yes, I know this is way too small
textField.setText("Text");
add(textField);
}
@Override
public void paint(Graphics g) {
g.setColor(new Color(0xDDDDE1));
g.fillRect(0, 4, 80, 8);
g.setColor(new Color(0x444448));
g.fillRect(sliderX, 0, 8, 16);
}
首先看一下在AWT和Swing中 執行自定義繪畫和繪畫
從本質上講,您所做的就是打破油漆鏈。 繪畫是由一系列鏈接的方法調用組成的,每種方法都會在過程,背景,邊框,子項等中添加一些內容。
通過重寫paint
並無法調用super.paint
,可以防止面板為子級繪畫。
現在,您可以改寫paintComponent
(確保您調用super.paintComponent
),仍然會super.paintComponent
問題,因為繪制是在子組件后面完成的。
更好(更簡單)的解決方案是創建兩個JPanel
並在那里使用background
顏色屬性以根據需要簡單地更改顏色。
不要使用null
布局,像素完美布局是現代GUI設計中的一種錯覺,您無法控制渲染在不同平台上的工作方式,尤其是字體的渲染方式。
利用適當的布局管理器
額外...
分開負責的領域。 “滑塊”負責...的滑動。 創建一個僅提供該功能的組件。 然后創建另一個組件,該組件使用此滑塊和JTextField
引入擴展功能...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class ColorSliderTest {
public static void main(String[] args) {
new ColorSliderTest();
}
public ColorSliderTest() {
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 BorderLayout());
frame.add(new ColorSliderPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ColorSliderPane extends JPanel {
private final ColorSliderControl colorSliderControl;
private final JTextField field;
public ColorSliderPane() {
field = new JTextField(5);
colorSliderControl = new ColorSliderControl();
setLayout(new BorderLayout());
add(colorSliderControl);
JPanel filler = new JPanel();
filler.add(field);
add(filler, BorderLayout.SOUTH);
}
}
public class ColorSliderControl extends JPanel {
private int sliderX;
public ColorSliderControl() {
setOpaque(false);
setBorder(new EmptyBorder(4, 4, 4, 4));
}
@Override
public Dimension getPreferredSize() {
Insets insets = getInsets();
int width = 80 + (insets.left + insets.right);
int height = 16 + (insets.top + insets.bottom);
return new Dimension(width, height);
}
@Override
public void paint(Graphics g) {
Insets insets = getInsets();
int y = getHeight() / 2;
int x = insets.left;
int width = getWidth() - (insets.left + insets.right);
g.setColor(new Color(0xDDDDE1));
g.fillRect(x, y - 4, width, 8);
g.setColor(new Color(0x444448));
g.fillRect(sliderX + x, y - 8, 8, 16);
}
}
}
在您說“但我希望字段在右邊”之前,請先更改
add(filler, BorderLayout.SOUTH);
至
add(filler, BorderLayout.EAST);
我可能還會提到JSlider
我想你已經畫了他們。
這是一種處理UI代碼的絕妙方法。 您要通過在面板的硬編碼位置上放置兩個具有硬編碼顏色的矩形來實現什么目的?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.