Java 自定义JButton:setText不';不起作用
我有自定义的JButton类,带有渐变背景和圆角。我应该重写setText()还是应该如何在其上显示文本?setText(“文本”)无效 UPD:正如MadProgrammer所建议的,我尝试了setContentAreaFilled(false),它解决了这个问题,但出现了另一个问题。我在不同的选项卡上有这样的按钮,当它们被重新绘制时,它们会出现几毫秒,就像它们都在同一个选项卡上一样。更新代码如下:Java 自定义JButton:setText不';不起作用,java,swing,jbutton,paintcomponent,settext,Java,Swing,Jbutton,Paintcomponent,Settext,我有自定义的JButton类,带有渐变背景和圆角。我应该重写setText()还是应该如何在其上显示文本?setText(“文本”)无效 UPD:正如MadProgrammer所建议的,我尝试了setContentAreaFilled(false),它解决了这个问题,但出现了另一个问题。我在不同的选项卡上有这样的按钮,当它们被重新绘制时,它们会出现几毫秒,就像它们都在同一个选项卡上一样。更新代码如下: public class DarkGradientButton extends JButton
public class DarkGradientButton extends JButton {
private Color startColor = new Color(178, 178, 178);
private Color endColor = new Color(131, 131, 131);
private Color disstartColor = new Color(252, 252, 252);
private Color disendColor = new Color(221, 221, 221);
private Color enstartColor = new Color(178, 178, 178);
private Color enendColor = new Color(131, 131, 131);
public DarkGradientButton(String text, ImageIcon ii) {
super(text, ii);
this.setContentAreaFilled(false);
}
public DarkGradientButton() {
super();
this.setContentAreaFilled(false);
}
@Override
protected void paintComponent( Graphics g )
{
g.setColor(new Color(246,250,245));
int h = getHeight();
int w = getWidth();
GradientPaint gradientPaint = new GradientPaint( 0 , 0 , startColor , 0 , h , endColor );
int[] x = {0, 1, w-1, w, w, w-1, w-2, 2, 1, 0};
int[] y = {1, 0, 0, 1, h-3, h-2, h-1, h-1, h-2, h-3};
Graphics2D graphics2D = (Graphics2D)g;
graphics2D.setPaint( gradientPaint );
graphics2D.fillPolygon(x, y, x.length);
graphics2D.setColor(this.getForeground());
super.paintComponent( g );
}
public void makeDisable() {
startColor = disstartColor;
endColor = disendColor;
Graphics g = this.getGraphics();
paintComponent(g);
this.repaint();
}
public void makeEnable() {
startColor = enstartColor;
endColor = enendColor;
Graphics g = this.getGraphics();
paintComponent(g);
this.repaint();
}
}
选项卡上的按钮(这是Netbeans为我生成的):
在逻辑情况下,您不需要覆盖
setText()
,但可以尝试使用它。在逻辑情况下,您不需要覆盖setText()
,但可以尝试使用它。我看不出您在哪里调用setText(),如果在绘制组件后尝试这样做,则需要调用rePaint()使任何图形更改具有可见效果。
不,您不需要重写setText(),这有什么意义?我不知道您在哪里调用setText(),如果您在绘制组件后尝试这样做,则需要调用rePaint(),以使任何图形更改产生可见的效果。 不,您不需要重写setText(),这有什么意义呢?
- 如果每个
都具有相同的颜色主题,您可以在JButtons
中更改vlauesUIManager
- 那么API中实现的其余方法就没有问题了
- 您可以覆盖
,例如BasicButtonUI
import java.util.List;
import javax.swing.*;
import javax.swing.plaf.ColorUIResource;
public class GradieltButton {
public static void main(String[] args) {
Object grad = UIManager.get("Button.gradient");
List gradient;
if (grad instanceof List) {
gradient = (List) grad;
System.out.println(gradient.get(0));
System.out.println(gradient.get(1));
System.out.println(gradient.get(2));
System.out.println(gradient.get(3));
System.out.println(gradient.get(4));
//gradient.set(2, new ColorUIResource(221, 232, 243));//origal Color
//gradient.set(2, new ColorUIResource(255, 255, 255));//origal Color
//gradient.set(2, new ColorUIResource(184, 207, 229));//origal Color
gradient.set(2, new ColorUIResource(190, 230, 240));
gradient.set(3, new ColorUIResource(240, 240, 240));
gradient.set(4, new ColorUIResource(180, 200, 220));
//UIManager.put("Button.background", Color.pink);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GradieltButton().makeUI();
}
});
}
public void makeUI() {
JButton button = new JButton("Click");
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(button);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
- 如果每个
都具有相同的颜色主题,您可以在JButtons
中更改vlauesUIManager
- 那么API中实现的其余方法就没有问题了
- 您可以覆盖
,例如BasicButtonUI
import java.util.List;
import javax.swing.*;
import javax.swing.plaf.ColorUIResource;
public class GradieltButton {
public static void main(String[] args) {
Object grad = UIManager.get("Button.gradient");
List gradient;
if (grad instanceof List) {
gradient = (List) grad;
System.out.println(gradient.get(0));
System.out.println(gradient.get(1));
System.out.println(gradient.get(2));
System.out.println(gradient.get(3));
System.out.println(gradient.get(4));
//gradient.set(2, new ColorUIResource(221, 232, 243));//origal Color
//gradient.set(2, new ColorUIResource(255, 255, 255));//origal Color
//gradient.set(2, new ColorUIResource(184, 207, 229));//origal Color
gradient.set(2, new ColorUIResource(190, 230, 240));
gradient.set(3, new ColorUIResource(240, 240, 240));
gradient.set(4, new ColorUIResource(180, 200, 220));
//UIManager.put("Button.background", Color.pink);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GradieltButton().makeUI();
}
});
}
public void makeUI() {
JButton button = new JButton("Click");
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(button);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
setText不起作用的主要原因是您在它上面的绘画
g.fillRect(0, 0, w, h);
您会发现ui在super.paintComponent(g)
调用中呈现文本,然后您在上面进行绘制
g.fillRect(0, 0, w, h);
更新
我使用下面的代码显示了一些选项卡,但没有发现任何错误
包装试验
导入java.awt.BorderLayout;
导入java.awt.GridBagLayout;
导入java.util.List;
导入javax.swing.*;
导入javax.swing.plaf.ColorUIResource
公共类测试按钮{
public static void main(String[] args) {
Object grad = UIManager.get("Button.gradient");
List gradient;
if (grad instanceof List) {
gradient = (List) grad;
System.out.println(gradient.get(0));
System.out.println(gradient.get(1));
System.out.println(gradient.get(2));
System.out.println(gradient.get(3));
System.out.println(gradient.get(4));
//gradient.set(2, new ColorUIResource(221, 232, 243));//origal Color
//gradient.set(2, new ColorUIResource(255, 255, 255));//origal Color
//gradient.set(2, new ColorUIResource(184, 207, 229));//origal Color
gradient.set(2, new ColorUIResource(190, 230, 240));
gradient.set(3, new ColorUIResource(240, 240, 240));
gradient.set(4, new ColorUIResource(180, 200, 220));
//UIManager.put("Button.background", Color.pink);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestButton().makeUI();
}
});
}
public void makeUI() {
JButton button = new JButton("Click");
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
JTabbedPane tab = new JTabbedPane();
tab.add("Help", createPane(1));
tab.add("Help", createPane(2));
tab.add("Help", createPane(3));
tab.add("Help", createPane(4));
tab.add("Help", createPane(5));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(tab);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
protected JPanel createPane(int index) {
JPanel panel = new JPanel(new GridBagLayout());
panel.add(new JButton("Hello " + index));
return panel;
}
}
setText不起作用的主要原因是您在它上面的绘画
g.fillRect(0, 0, w, h);
您会发现ui在super.paintComponent(g)
调用中呈现文本,然后您在上面进行绘制
g.fillRect(0, 0, w, h);
更新
我使用下面的代码显示了一些选项卡,但没有发现任何错误
包装试验
导入java.awt.BorderLayout;
导入java.awt.GridBagLayout;
导入java.util.List;
导入javax.swing.*;
导入javax.swing.plaf.ColorUIResource
公共类测试按钮{
public static void main(String[] args) {
Object grad = UIManager.get("Button.gradient");
List gradient;
if (grad instanceof List) {
gradient = (List) grad;
System.out.println(gradient.get(0));
System.out.println(gradient.get(1));
System.out.println(gradient.get(2));
System.out.println(gradient.get(3));
System.out.println(gradient.get(4));
//gradient.set(2, new ColorUIResource(221, 232, 243));//origal Color
//gradient.set(2, new ColorUIResource(255, 255, 255));//origal Color
//gradient.set(2, new ColorUIResource(184, 207, 229));//origal Color
gradient.set(2, new ColorUIResource(190, 230, 240));
gradient.set(3, new ColorUIResource(240, 240, 240));
gradient.set(4, new ColorUIResource(180, 200, 220));
//UIManager.put("Button.background", Color.pink);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestButton().makeUI();
}
});
}
public void makeUI() {
JButton button = new JButton("Click");
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
JTabbedPane tab = new JTabbedPane();
tab.add("Help", createPane(1));
tab.add("Help", createPane(2));
tab.add("Help", createPane(3));
tab.add("Help", createPane(4));
tab.add("Help", createPane(5));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(tab);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
protected JPanel createPane(int index) {
JPanel panel = new JPanel(new GridBagLayout());
panel.add(new JButton("Hello " + index));
return panel;
}
}
我试过像super.setText(text)一样,但没有效果either@Natalia用一个只委托给超类的调用重写它就相当于不重写该方法。当然这没有效果。我像super.setText(text)一样尝试过但没有效果either@Natalia用一个只委托给超类的调用重写它就相当于不重写该方法。当然,这没有效果,删除了该部分,它也不起作用。也许这是渐变覆盖文本?我如何将其放置在“下”文本?任何填充操作都会在文本上绘制,请尝试将fillContentArea属性设置为false,并将自定义绘制放置在超级调用之前。如果这不起作用,可能会有一个小技巧,我用来在表和树上绘制糖果条带,这可能会在swing中起作用,任何经过组件的图形上下文都保证是Graphics2Dobject在我的测试中,将contentAreaFilled和BorderPaint设置为false允许我在文本下进行渲染。我不知道这是否是您想要的效果,但这可能有助于我发现问题。我将此类按钮放置在不同的选项卡上。重新绘制()时为它们调用时,它们会出现几毫秒,就好像它们都在当前选项卡上一样。删除了该部分,它也不起作用。可能是渐变叠加文本?我如何将其放置在“下”文本?任何填充操作都会在文本上绘制,请尝试将fillContentArea属性设置为false,并将自定义绘制放置在超级调用之前。如果这不起作用,可能会有一个小技巧,我用来在表和树上绘制糖果条带,这可能会在swing中起作用,任何经过组件的图形上下文都保证是Graphics2Dobject在我的测试中,将contentAreaFilled和BorderPaint设置为false允许我在文本下进行渲染。我不知道这是否是您想要的效果,但这可能有助于我发现问题。我将此类按钮放置在不同的选项卡上。重新绘制()时为它们调用时,它们会出现几毫秒,就好像它们都在当前选项卡上一样。我稍后会从代码中调用它。当为普通JButton调用setText()时,不会调用repaint()在那之后。确实callin setText最终会触发JButton的重新绘制。也许我认为我错了,但系统如何知道何时触发重新绘制?它会发生在每个视觉组件的每次更新上吗?我必须承认GUI不是我的主要专长。我稍后从代码中调用它。当您调用setText()时对于普通JButton,不调用repaint()在那之后。确实callin setText最终会触发JButton的重新绘制。也许我认为我错了,但系统如何知道何时触发重新绘制?它会发生在每个视觉组件的每次更新上吗?我必须承认GUI不是我的主要专长。不适合我,我需要不同的按钮不适合我,我需要不同的nt按钮不起作用的不是setText