在 JPanel 中填充 JButton
Filling JButton inside a JPanel
我有一个 JPanel 作为我的应用程序的顶部栏,我现在正在尝试设计顶部栏按钮,但我遇到了一个问题。
正如您所见,当我将鼠标悬停在它上面时,红色没有填满面板,我希望红色是一个完整的正方形。并保持顶部栏和图标大小相同。我期望的结果是
如您所见,颜色已填满整个条形。我想重新创建这个。
下面是创建悬停效果的自定义 JButtonClass 代码。
public class LynxButton extends JButton {
public LynxButton(){
super.setContentAreaFilled(false);
}
public LynxButton(String text) {
super(text);
super.setContentAreaFilled(false);
}
@Override
protected void paintComponent(Graphics g) {
Color pressedColor = ThemeManager.red_LYNX.darker();
if (getModel().isPressed()) {
g.setColor(pressedColor);
} else if (getModel().isRollover()) {
g.setColor(pressedColor);
} else {
g.setColor(getBackground());
}
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
@Override
public void setContentAreaFilled(boolean b) {
}
}
然后我们使用
定义代码
LynxButton exitButton = new LynxButton();
exitButton.setIcon(...);
exitButton.setBorder(null);
我尝试设置边距以查看它是否可以解决问题,但还是没有成功。
exitButton.setMargin(new Insets(0, 0, 0, 0));
编辑:忘记显示 JPanel 定义
JPanel buttonContainer = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttonContainer
填满了整个顶部栏,通过删除对 setBackgroundColor 的调用来确认。
您没有从 FlowLayout
中计算出 hgap
和 vgap
。它们就像自然边界。
您需要做的就是将 JPanel
的初始化更改为 new JPanel(new FlowLayout(FlowLayout.RIGHT), 0, 0)
示例代码:
public static void main(String[] args) {
JFrame f = new JFrame();
TestA b = new TestA("X");
JPanel buttonContainer = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
buttonContainer.setBackground(Color.GREEN);
buttonContainer.add(b);
f.add(buttonContainer);
f.pack();
f.setVisible(true);
}
TestA
是你的 LynxButton
class TestA extends JButton {
public TestA() {
super.setContentAreaFilled(false);
}
public TestA(String text) {
super(text);
super.setContentAreaFilled(false);
}
@Override
protected void paintComponent(Graphics g) {
Color pressedColor = Color.RED;
if (getModel().isPressed()) {
g.setColor(pressedColor);
} else if (getModel().isRollover()) {
g.setColor(pressedColor);
} else {
g.setColor(getBackground());
}
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
@Override
public void setContentAreaFilled(boolean b) {
}
}
我有一个 JPanel 作为我的应用程序的顶部栏,我现在正在尝试设计顶部栏按钮,但我遇到了一个问题。
正如您所见,当我将鼠标悬停在它上面时,红色没有填满面板,我希望红色是一个完整的正方形。并保持顶部栏和图标大小相同。我期望的结果是
如您所见,颜色已填满整个条形。我想重新创建这个。
下面是创建悬停效果的自定义 JButtonClass 代码。
public class LynxButton extends JButton {
public LynxButton(){
super.setContentAreaFilled(false);
}
public LynxButton(String text) {
super(text);
super.setContentAreaFilled(false);
}
@Override
protected void paintComponent(Graphics g) {
Color pressedColor = ThemeManager.red_LYNX.darker();
if (getModel().isPressed()) {
g.setColor(pressedColor);
} else if (getModel().isRollover()) {
g.setColor(pressedColor);
} else {
g.setColor(getBackground());
}
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
@Override
public void setContentAreaFilled(boolean b) {
}
}
然后我们使用
定义代码 LynxButton exitButton = new LynxButton();
exitButton.setIcon(...);
exitButton.setBorder(null);
我尝试设置边距以查看它是否可以解决问题,但还是没有成功。
exitButton.setMargin(new Insets(0, 0, 0, 0));
编辑:忘记显示 JPanel 定义
JPanel buttonContainer = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttonContainer
填满了整个顶部栏,通过删除对 setBackgroundColor 的调用来确认。
您没有从 FlowLayout
中计算出 hgap
和 vgap
。它们就像自然边界。
您需要做的就是将 JPanel
的初始化更改为 new JPanel(new FlowLayout(FlowLayout.RIGHT), 0, 0)
示例代码:
public static void main(String[] args) {
JFrame f = new JFrame();
TestA b = new TestA("X");
JPanel buttonContainer = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
buttonContainer.setBackground(Color.GREEN);
buttonContainer.add(b);
f.add(buttonContainer);
f.pack();
f.setVisible(true);
}
TestA
是你的 LynxButton
class TestA extends JButton {
public TestA() {
super.setContentAreaFilled(false);
}
public TestA(String text) {
super(text);
super.setContentAreaFilled(false);
}
@Override
protected void paintComponent(Graphics g) {
Color pressedColor = Color.RED;
if (getModel().isPressed()) {
g.setColor(pressedColor);
} else if (getModel().isRollover()) {
g.setColor(pressedColor);
} else {
g.setColor(getBackground());
}
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
@Override
public void setContentAreaFilled(boolean b) {
}
}