Я занимаюсь разработкой java-апплетов после учебника, найденного здесь: Я использую это как основу для расширения своего собственного приложения. Но вот проблема.Изображения не рисованы/показаны с использованием paintComponent()
Я хочу добавить JButtons в апплет для определенных функций (запуск, параметры и т. Д.). Но я обнаружил, что они мерцают, когда я нависаю над ними и полностью скрываюсь, если не тронут. Я читал, что он должен делать с двойной буферизации, и что я должен использовать paintComponent вместо краски, например
public void paintComponents(Graphics g) {
super.paintComponents(g);
}
Это решает JButtons от мерцающих, но тогда методы g.drawimage обанкротились, или я ничего не понимаю полностью, поскольку изображения, которые я пытаюсь нарисовать, не отображаются. Я не знаю, скрыты они или не могут быть загружены или что. Если бы кто-то мог указать на правильное направление, это было бы здорово.
public class StartingClass extends Applet implements Runnable, KeyListener, ActionListener {
private PlayerChar playerChar;
private Image image, currentSprite, character, characterDown, characterJumped, background;
private Graphics second;
private URL base;
private static Background bg1, bg2;
private JButton start, options;
private boolean running = false;
private int score;
@Override
public void init() {
setSize(800, 480);
setFocusable(true);
addKeyListener(this);
Frame frame = (Frame) this.getParent().getParent();
frame.setTitle("GraviOn-Alpha");
try {
base = getDocumentBase();
}
catch (Exception e) {
// TODO: handle exception
}
// Image Setups
character = getImage(base, "data/character.png");
characterDown = getImage(base, "data/down.png");
characterJumped = getImage(base, "data/jumped.png");
currentSprite = character;
background = getImage(base, "data/background.png");
score = 0;
}
@Override
public void start() {
bg1 = new Background(0, 0);
bg2 = new Background(2160, 0);
playerChar = new PlayerChar();
JPanel myPanel = new JPanel();
start = new JButton("Start");
start.addActionListener(this);
options = new JButton("Change Colour");
options.addActionListener(this);
myPanel.add(start);
myPanel.add(options);
myPanel.setBackground(Color.BLACK);
myPanel.setPreferredSize(new Dimension(100, 75));
this.add(myPanel);
Thread thread = new Thread(this);
thread.start();
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void run() {
while (true) {
if (running == true) {
playerChar.moveRight();
score += 3;
start.setVisible(false);
options.setVisible(false);
}
else {
}
playerChar.update();
if (playerChar.isJumped()) {
currentSprite = characterJumped;
}
else if (playerChar.isJumped() == false && playerChar.isDucked() == false) {
currentSprite = character;
}
bg1.update();
bg2.update();
repaint();
try {
Thread.sleep(17);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void update(Graphics g) {
if (image == null) {
image = createImage(this.getWidth(), this.getHeight());
second = image.getGraphics();
}
second.setColor(getBackground());
second.fillRect(0, 0, getWidth(), getHeight());
second.setColor(getForeground());
paint(second);
g.drawImage(image, 0, 0, this);
}
@Override
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.drawImage(background, bg1.getBgX(), bg1.getBgY(), this);
g.drawImage(background, bg2.getBgX(), bg2.getBgY(), this);
g.drawImage(currentSprite, playerChar.getCenterX() - 61, playerChar.getCenterY() - 63, this);
g.drawString("Score: " + score, 50, 50);
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
System.out.println("Move up");
break;
case KeyEvent.VK_DOWN:
currentSprite = characterDown;
if (playerChar.isJumped() == false) {
playerChar.setDucked(true);
playerChar.setSpeedX(0);
}
break;
case KeyEvent.VK_LEFT:
// playerChar.moveLeft();
playerChar.setMovingLeft(true);
break;
case KeyEvent.VK_RIGHT:
// playerChar.moveRight();
playerChar.setMovingRight(true);
break;
case KeyEvent.VK_SPACE:
playerChar.jump();
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
System.out.println("Stop moving up");
break;
case KeyEvent.VK_DOWN:
currentSprite = character;
playerChar.setDucked(false);
break;
case KeyEvent.VK_LEFT:
playerChar.stopLeft();
break;
case KeyEvent.VK_RIGHT:
playerChar.stopRight();
break;
case KeyEvent.VK_SPACE:
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public static Background getBg1() {
return bg1;
}
public static Background getBg2() {
return bg2;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Start")) {
running = true;
}
if (e.getActionCommand().equals("Change Colour") && character == getImage(base, "data/character.png")) {
character = getImage(base, "data/character2.png");
}
else if (e.getActionCommand().equals("Change Colour") && character == getImage(base, "data/character2.png")) {
character = getImage(base, "data/character.png");
}
repaint();
}
}
Это попытка использования метода paintComponents. Я был бы очень признателен за помощь.
EDIT: Я изменил использование Japplet и использовал paintComponent в Jpanel, чтобы нарисовать все, и он работал нормально, все на основе JApplet - super.paint(); causes flicker.
'общественный недействительный paintComponents (График г) {super.paintComponents (г);' 'должен быть общественной недействительной краска (график г) {super.paint (г);'. Другие вопросы: 1) Зачем использовать AWT? См. [Этот ответ] (http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978) по многим причинам, чтобы отказаться от использования AWT с использованием компонентов в пользу Swing. 2) Зачем писать апплет? Если это связано с тем, что учитель указал на это, обратитесь к [Почему учителя CS должны ** останавливаться ** преподавать Java-апплеты] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-учебно-ява-апплеты /). –
@AndrewThompson Tha kyou для ответа, я изменил его на paint() из paintComponents(), но теперь я вернулся к квадрату, изображения рисуются, но jbuttons не отображаются, если я не навис над ними, и они мерцают один раз Я делаю. –