最近,我一直在构建一个应用程序,在JFrame上绘制图像,一切都很好,但是当窗口离开屏幕时,已经绘制的图像消失了,我一直在想是否有办法避免这种情况?谢谢
import javax.swing.*;
导入java。awt。;导入java。awt。事件
公共类Pokemoneur扩展了JFrame,实现了AdjustmentListener、ActionListener、MouseListener和Runnable{
private JButton a = new JButton("Reset");
private int nbi = 7;
private JPanel frame;
private int n;
private int x2, y2;
private static int temp2;
private Object src;
private Thread t;
private JButton[] v = new JButton[nbi];
private ImageIcon[] imagei = new ImageIcon[7];
private JPanel canevas = new JPanel();
private JTextField nombre = new JTextField(7);
private JScrollBar js = new JScrollBar(0, 0, 0, 0, 100);
private JPanel panboutton = new JPanel(new GridLayout(1, 8));
private JPanel panjs = new JPanel(new BorderLayout(5, 5));
private JPanel frame2 = new JPanel(new GridLayout(2, 1, 5, 5));
private Graphics g;
public Pokemoneur() {
startGUI();
list();
this.setVisible(true);
}
public void startGUI() {
int max = 1000;
frame = (JPanel) this.getContentPane();
for (int i = 0; i < imagei.length; i++) {
}
frame.add(canevas);
frame.add(frame2, "North");
frame2.add(panboutton);
frame2.add(panjs);
js.setValue(6);
nombre.setText("" + js.getValue());
for (int i = 0; i < nbi; i++) {
imagei[i] = new ImageIcon(getClass()
.getResource("pok" + i + ".png"));
v[i] = new JButton(imagei[i]);
panboutton.add(v[i]);
}
panjs.add(js);
js.setMaximum(max);
panjs.add(nombre, "East");
frame.setPreferredSize(new Dimension(500, 500));
frame.setBorder(BorderFactory.createTitledBorder("Marc André 2014"));
panjs.setBorder(BorderFactory.createTitledBorder("Numbers of Pokemons"));
canevas.setBorder(BorderFactory.createTitledBorder("Party"));
frame.add(a, "South");
g = canevas.getGraphics();
this.pack();
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void run() {
for (int i = 0; i < v.length; i++) {
if (src == v[i]) {
for (int j = 0; j < js.getValue(); j++) {
int x = (int) (Math.random() * canevas.getWidth());
int y = (int) (Math.random() * canevas.getHeight());
int n = 0;
do {
n = (int) (Math.random() * nbi);
} while (n == i);
if (x > 80)
x -= 80;
if (y > 80)
y -= 80;
g.drawImage(imagei[n].getImage(), x, y, null);
}
x2 = (int) (Math.random() * canevas.getWidth());
y2 = (int) (Math.random() * canevas.getHeight());
if (x2 > 80)
x2 -= 80;
if (y2 > 80)
y2 -= 80;
g.drawImage(imagei[i].getImage(), x2, y2, null);
temp2 = i;
do {
n = (int) (Math.random() * nbi);
} while (n == temp2);
g.drawImage(imagei[n].getImage(), x2 + 13, y2, null);
}
}
}
public void list() {
js.addAdjustmentListener(this);
for (int i = 0; i < nbi; i++) {
v[i].addActionListener(this);
}
a.addActionListener(this);
canevas.addMouseListener(this);
}
public void adjustmentValueChanged(AdjustmentEvent x) {
nombre.setText("" + js.getValue());
}
public void actionPerformed(ActionEvent ae) {
src = ae.getSource();
if (src == a) {
try {
g.setColor(canevas.getBackground());
g.fillRect(0, 0, canevas.getWidth(), canevas.getHeight());
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
g = canevas.getGraphics();
g.setColor(canevas.getBackground());
g.fillRect(0, 0, canevas.getWidth(), canevas.getHeight());
t = new Thread(this);
t.start();
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println(x2 + "," + y2 + "\n" + x + " " + y);
// if((x>=x2 && x<=x2+80)&&(x>=x2 && y<=y2+80)){
if ((x >= x2 && x <= x2 + 80) && (y >= y2 && y <= y2 + 80)) {
System.out.println("True");
g.setColor(canevas.getBackground());
g.fillRect(0, 0, canevas.getWidth(), canevas.getHeight());
System.out.println("in");
g.drawImage(imagei[temp2].getImage(), x2, y2, null);
System.out.println(temp2);
System.out.println("end");
} else {
System.out.println("false");
}
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
new Pokemoneur();
}
}问题是,当用户在屏幕上画出图像后移动Jframe时,图像不会停留。。。
之前:http://i.stack.imgur.com/KHIvm.png之后:http://i.stack.imgur.com/koZSI.png
你问:
但当窗口离开屏幕时,已经绘制的图像消失了,我一直在想是否有办法避免这种情况?
这意味着你在代码中的某个地方有一个错误,在你实际上没有向我们展示的代码中。
也许您正在使用通过调用组件上的getGraphics()
获得的图形对象进行绘制,但此时我所能做的就是进行一个疯狂的猜测。如果要这样做,请不要这样做。在组件上调用getGraphics()
,将得到一个在重复绘制中不会持久的图形对象,并将生成同样不会持久的图像。而是使用JFrame中显示的JPanel的paintComponent(Graphics g)
方法进行绘制,如使用Swing执行自定义绘制教程中所述。但最重要的是,请在提问时稍微努力一点,这样我们就不必猜测代码没有被看到。
有没有办法绕过的正常行为及其屏幕外页限制?我的包含四个,每个片断包含一个图像。我遇到的问题是,在实例化时,会创建两个,这导致从catch同时下载/提取大约20个图像(每个片断大约10个)。是否可以禁用屏幕外页限制? 我的目标是只在选择时下载图像,或者只在用户悬停图像时下载图像。实现这一点的一种方法是使用侦听器并设置一个标志,该标志告诉是否允许下载图像。 我能想到的第二种方法是在上设置一个,并且只在
我有旧式菜单应用程序。在改变主题到全息和切换目标SDK版本到14后,软菜单按钮消失了(这是好的),但使用菜单按钮在操作栏显示文本菜单大部分离屏幕,你可以看到在附上的图像。你有什么办法解决这个问题吗? 我已经解决了。清单参数中有问题: 在改变了任何否认为真之后,这个问题就消失了。
我想知道是否有一个用于HighChart的Java API(不是导出API),它可以根据提供的参数生成svg,然后可以使用Batik转换为png,而无需靠近HTTP请求。 目前,我能想到的唯一方法是发布到一个带有图表点的虚拟页面,然后导出到SVG并提交到带有Javascript的导出服务,Javascript将其转换为带有蜡染的PNG,然后以图像流的形式返回。 然而,我所需要的只是从数据库中获取由
问题内容: 我已经有了典型的下拉导航,并且试图确保下拉菜单链接始终可访问和可见: CSS确实没有什么特别的(删除了颜色和背景): 顶级链接数量未知(由用户创建)。我遇到的问题是,如果顶层链接距离右侧太远,有时下拉菜单(位于右侧)将不在屏幕上。我添加了以下CSS来补偿: 现在,最后一个位于屏幕左侧,而不是离开屏幕,这很不错,但是存在一些问题: 对于上一个链接,我并不总是需要这些样式,因为它并不总是在
screen 模块用于检索有关屏幕大小,显示,光标位置等的信息 进程: 主进程 渲染进程 screen 是一个 EventEmitter. 注意: app模块必须用在 ready事件后. 注意: 在渲染进程或开发者工具栏中, window.screen 是一个预设值的 DOM属性, 所以 var screen = require('electron').screen 这样写的话是无效的. 创建一