gpt4 book ai didi

java - 单击按钮更改 jpanel 的背景和字体颜色

转载 作者:行者123 更新时间:2023-11-29 03:45:08 25 4
gpt4 key购买 nike

我想在单击按钮时更改 Jpanel 的背景颜色及其字体。

谁能告诉我我做错了什么?我可以将 JPanel 背景设置为透明吗?如果可以,如何设置?

在我需要更改 Jpanel 背景颜色的地方调用按钮单击 test4.action 方法?

代码如下:

import java.applet.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import javax.swing.*;

public class test3 extends Applet {

JPanel c;
JScrollPane s;
Button connect;
Panel controls;
Color back, fore;

public void init() {
back = Color.black;
fore = Color.white;
setBackground(Color.darkGray);
setLayout(new BorderLayout());
s = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
//s.setSize(100, 100);
add("Center", s);
c = new myCanvas11(this);
s.setOpaque(false);
s.setViewportView(c);
//s.add(c);
c.setSize(1000, 16000);
add("North", controls = new Panel());
controls.setLayout(new FlowLayout());
controls.add(connect = new Button("Change Color"));
}

public void start() {
// s.setScrollPosition(100, 100);
}

public boolean action(Event e, Object arg) {
back = Color.magenta;
fore = Color.blue;
//setBackground(back);
//invalidate();
//repaint();
c.setBackground(back);
c.repaint();
//s.getViewport().setBackground(back);
// s.getViewport().repaint();
//c.repaint();
c.setFocusable(true);
return true;
}
}

class myCanvas11 extends JPanel implements KeyListener {

Image buffImage;
Graphics offscreen;
boolean initDone = false;
int chw, chh; // size of a char (in pixels)
int chd; // offset of char from baseline
int width, height; // size of applet (in pixels)
int w, h; // size of applet (in chars)
Font fn;
Graphics gr;
int nh, nw;
test3 owner;
static int counter = 0;

myCanvas11(test3 t) {
super();
owner = t;
nh = 16000;
nw = 1000;
this.setOpaque(true);
this.setFocusable(true);
addKeyListener(this);
}

public void reshape(int nx, int ny, int nw1, int nh1) {
if (nw1 != width || nh1 != height) {
width = nw;
height = nh;
gr = getGraphics();
fn = new Font("Courier", Font.PLAIN, 11);
if (fn != null) {
gr.setFont(fn);
}
FontMetrics fnm = gr.getFontMetrics();
chw = fnm.getMaxAdvance();
chh = fnm.getHeight();
chd = fnm.getDescent();
// kludge for Windows NT and others which have too big widths
if (chw + 1 >= chh) {
chw = (chw + 1) / 2;
}
// work out size of drawing area
h = nh / chh;
w = nw / chw;
buffImage = this.createImage(nw, nh);
offscreen = buffImage.getGraphics();
//offscreen.setColor(Color.black);
//offscreen.fillRect(0, 0, nw, nh);
offscreen.setColor(Color.blue);
offscreen.setFont(fn);
if (initDone) {
offscreen.drawString("Hello World!", 0, 50);
} else {
offscreen.drawString("khushbu", 2, 50);
}
initDone = true;
offscreen.drawImage(buffImage, 0, 0, this);
}
super.reshape(nx, ny, nw, nh);
}

public void paint(Graphics g) {
// if (!initDone)
// initpaint(g);
// else
g.drawImage(buffImage, 0, 0, this);
//g.drawImage(buffImage, 0, 0, owner.back, this);

}

public void update(Graphics g) {
g.drawImage(buffImage, 0, 0, this);
super.update(g);
//g.drawImage(buffImage, 0, 0, owner.back, this);
}

public void initpaint(Graphics g) {
try {
nh = getHeight();
nw = getWidth();
gr = getGraphics();
fn = new Font("Courier", Font.PLAIN, 11);
if (fn != null) {
gr.setFont(fn);
}
FontMetrics fnm = gr.getFontMetrics();
chw = fnm.getMaxAdvance();
chh = fnm.getHeight();
chd = fnm.getDescent();
// kludge for Windows NT and others which have too big widths
if (chw + 1 >= chh) {
chw = (chw + 1) / 2;
}
// work out size of drawing area
h = nh / chh;
w = nw / chw;
buffImage = this.createImage(nw, nh);
offscreen = buffImage.getGraphics();
//offscreen.setColor(Color.black);
//offscreen.fillRect(0, 0, nw, nh);
offscreen.setColor(Color.white);
offscreen.setFont(fn);
if (initDone) {
offscreen.drawString("Hello World!", 0, 50);
} else {
offscreen.drawString("khushbu", 2, 50);
}
initDone = true;
g.drawImage(buffImage, 0, 0, this);
} catch (Exception e) {
e.printStackTrace();
}
}

/** Handle the key typed event from the text field. */
public void keyTyped(KeyEvent e) {
}

/** Handle the key pressed event from the text field. */
public void keyPressed(KeyEvent e) {
String s;
offscreen.setColor(owner.fore);
offscreen.setFont(fn);
for (int i = counter; i < counter + 25; ++i) {
s = Integer.toString(i);
offscreen.drawString(s, 3, i * chh);
offscreen.drawLine(10, i * chh, 160, i * chh);
}
//owner.s.setScrollPosition(0, counter * 16);
counter = counter + 25;
repaint();
}

/** Handle the key released event from the text field. */
public void keyReleased(KeyEvent e) {
}

public boolean keyDown(Event e, int k) {
String s;
offscreen.setColor(owner.fore);
offscreen.setFont(fn);
for (int i = counter; i < counter + 25; ++i) {
s = Integer.toString(i);
offscreen.drawString(s, 3, i * chh);
offscreen.drawLine(10, i * chh, 160, i * chh);
}
//owner.s.setScrollPosition(0, counter * 16);
counter = counter + 25;
repaint();
return true;
}
}

最佳答案

Can I set JPanel background transparent?if yes How?

是的,只需在该 JPanel 上调用 setOpaque(false);。相反,如果要绘制背景,请在该面板上调用 setOpaque(true);

补充说明:

  1. public boolean action(Event e, Object arg) 已弃用。添加适当的监听器。
  2. 遵循 Java 编码约定并使用大写字母作为类的第一个字符
  3. 您几乎不应该在组件上调用 getGraphics();
  4. 不要覆盖 public void paint(Graphics g)protected void paintComponent(Graphics g)。如果要绘制背景,请不要忘记调用 super.paintComponent
  5. 为什么要覆盖 reshape ?
  6. 为什么要创建内部缓冲区? Swing 已经内置了双缓冲,而且他们做得更好。
  7. 如果您已经覆盖了 paint(),为什么还要覆盖 update()?您正在执行相同的工作两次。
  8. 删除那个 gr 类变量,它没有任何意义。当您使用 Graphics 对象时,请使用作为 paintComponent 方法的参数提供的对象,但不要保留对它的引用,因为它稍后会被处理掉。
  9. counter 不需要是static。尽量避免static
  10. 尽量避免你的类之间有太多耦合。它使您的代码更难维护且更难预测。
  11. 下次,发布 SSCCE使用 Applet 以外的东西(例如 JFrame),除非您遇到的问题确实需要重现 Applet。

关于java - 单击按钮更改 jpanel 的背景和字体颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11323613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com