请考虑以下代码片段:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
public class TestApplet extends JApplet
{
@Override
public void init()
{
try
{
SwingUtilities.invokeAndWait(new Runnable()
{
@Override
public void run()
{
createGUI();
}
});
}
catch(InterruptedException | InvocationTargetException ex)
{
}
}
private void createGUI()
{
getContentPane().setLayout(new FlowLayout());
JButton startButton = new JButton("Do work");
startButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
JLabel label = new JLabel();
new Worker(label).execute();
}
});
getContentPane().add(startButton);
}
private class Worker extends SwingWorker<Void, …Run Code Online (Sandbox Code Playgroud) 我刚刚创建了一个小程序
public class HomeApplet extends JApplet {
private static final long serialVersionUID = -7650916407386219367L;
//Called when this applet is loaded into the browser.
public void init() {
//Execute a job on the event-dispatching thread; creating this applet's GUI.
// setSize(400, 400);
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createGUI();
}
});
} catch (Exception e) {
System.err.println("createGUI didn't complete successfully");
}
}
private void createGUI() {
RconSection rconSection = new RconSection();
rconSection.setOpaque(true);
// CommandArea commandArea = new CommandArea(); …Run Code Online (Sandbox Code Playgroud) 问题:在运行方法之前,图形不会重新绘制.
单击按钮时会调用两个方法.每个方法内部都是代码,用于更改与此方法关联的图形的颜色(在UI中); 当方法开始时,图形从黑色变为绿色; 当方法完成时,颜色从绿色变为红色.然后调用下一个方法,其图形应变为绿色(方法正在运行),当方法完成时,其图形应填充红色(方法完成).
我创建了一个简单的状态圆图形(带有填充颜色的30像素圆圈),有3种颜色状态:黑色表示准备好; 绿色的跑步; 红色完成.
我认为这个问题与repaint()单独的线程有关并且计划在能够运行时运行?我尝试将更新图形的代码放在自己的thread-runnable中,然后使用线程.join()确保代码已经完成运行但是没有用.
编辑:删除我用于演示的代码,并根据注释替换单个可运行的代码示例.如果运行代码,您将看到的是在单击每个方法启动和停止时图形不更新的按钮后,它会等待两个方法都运行然后重新绘制图形.
package graphicsUpdateDemo;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.beans.Transient;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
* Application entry
*/
public class App{
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame();
}
}); …Run Code Online (Sandbox Code Playgroud) 我正在为我的计算机科学课开发一个应用程序.任务是编写计算器,但不使用JTextFields或JTextAreas.我想出了一个实现的想法,KeyListener它在appletviewer中都很好用JFrame但在Google Chrome(可能还有其他浏览器)中根本不起作用.
这是我的代码片段.
//- BinaryCalc.java
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class BinaryCalc extends JApplet implements KeyListener {
private JPanel panel;
public BinaryCalc() {
super();
panel = new JPanel();
this.add(panel);
panel.addKeyListener(this);
panel.requestFocusInWindow();
}
@Override
public void init() {
JOptionPane.showMessageDialog(this, "applet");
panel.setFocusable(true);
panel.requestFocus();
}
public void keyPressed(KeyEvent e) {
JOptionPane.showMessageDialog(this, (char) e.getKeyCode());
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public …Run Code Online (Sandbox Code Playgroud) 编辑:使用awt ...
我试图在基于applet的数学游戏中显示随机数,并遇到了一个问题.根据我调用方法的位置,发生以下两种情况之一:
快速插图:
private int setNumberOne() {
return rand.nextInt(11) + 2;
}
private int setNumberTwo() {
return rand.nextInt(11) + 2;
}
private int setAnswer() {
return setNumberTwo() * setNumberOne();
}
private void displayOutput() {
Graphics2D g2d = graphics();
int one = setNumberOne();
int ans = setAnswer();
setNumberTwo();
g2d.setColor(Color.WHITE);
g2d.drawString(one + " x ? = " + ans, 480, 480);
}
Run Code Online (Sandbox Code Playgroud)
在初始化方法中调用此函数会显示一个静态问题,我可以在满足特定触发器时在其他位置更新,但是更新事件会在其上方绘制其他所有内容,使其不可见.我设法看到这个工作的唯一方法是从游戏中删除其他图像进行测试.
有没有办法在applet中设置GUI元素的"优先级"?
我目前正在尝试将该displayOutput()方法包含在它自己的线程中,但我对Java并不是那么有经验,并且证明它很难解决.
我也尝试不允许后台在运行时更新,但结果是移动的游戏对象在整个屏幕上留下了痕迹.
我错过了什么?如果有人对如何正确实施这些建议有任何建议,我会很高兴听到他们的意见.
更新:"...在AWT中使用Component的paint(...)方法绘制,并使用JVM传入的Graphics对象" - …
我有一个大的Java小程序(大约7 MB).这是一个古老而又大的项目,由几个小型项目组成,所有项目都使用"fatjar"捆绑在一个罐子里.由于applet是一项老技术而且我的功能有问题(我的applet没有签名)你能告诉我将代码切换到JWS(Java web start)的确切好处,并且它是值得的开关吗?
如果我切换到JWS,我将能够将我的applet分成几个罐子,这些罐子将由主罐子加载和使用(很像dll)?我的目标是将当前的applet分成几个独立的罐子.这样,当我在一个项目中更改某些内容时,我只会上传一个包含已更改项目的小jar,而不是整个,大而胖的applet.
如果JWS没有比applet好多少,你能建议我使用SWING的其他技术吗?重写(并分成MVC)整个事情所以它使用HTML或其他东西是不行的.我的applet使用的几乎所有控件都是扩展标准SWING控件的特殊自定义控件.
我想将 JApplet 转换为 JFrame。我在互联网上找到了这个代码,它是一个单词搜索游戏。我想在类的演示中使用此代码。但我不想在小程序中使用它。我要在这里粘贴的代码大了大约 7,000 个字符。我尝试使用 JApplet 并扩展 JFrame,然后将初始化的所有代码放入构造函数(零参数构造函数)中。这会导致我无法修复的大约十个错误。我想做一个单词搜索游戏,我找到了一个很好的例子,但我无法让它在我的 Eclipse 中运行。
class WordSearch extends JApplet
implements Runnable, KeyListener, MouseListener, MouseMotionListener {
// Copyright information.
String copyName = "Word Search";
String copyVers = "Version 1.1";
String copyInfo = "Copyright 1999-2001 by Mike Hall";
String copyLink = "http://www.brainjar.com";
String copyText = copyName + '\n' + copyVers + '\n'
+ copyInfo + '\n' + copyLink;
// Thread control variables.
Thread loopThread; // Main thread.
// Constants
static final int DELAY = 50; // …Run Code Online (Sandbox Code Playgroud)