Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义JButton:setText不';不起作用_Java_Swing_Jbutton_Paintcomponent_Settext - Fatal编程技术网

Java 自定义JButton:setText不';不起作用

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

我有自定义的JButton类,带有渐变背景和圆角。我应该重写setText()还是应该如何在其上显示文本?setText(“文本”)无效

UPD:正如MadProgrammer所建议的,我尝试了setContentAreaFilled(false),它解决了这个问题,但出现了另一个问题。我在不同的选项卡上有这样的按钮,当它们被重新绘制时,它们会出现几毫秒,就像它们都在同一个选项卡上一样。更新代码如下:

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
    都具有相同的颜色主题,您可以在
    UIManager
    中更改vlaues

  • 那么API中实现的其余方法就没有问题了

  • 您可以覆盖
    BasicButtonUI
    ,例如

UIManager的代码

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
    都具有相同的颜色主题,您可以在
    UIManager
    中更改vlaues

  • 那么API中实现的其余方法就没有问题了

  • 您可以覆盖
    BasicButtonUI
    ,例如

UIManager的代码

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