Java Jar文件在Mac和Linux上的工作方式不同

Java Jar文件在Mac和Linux上的工作方式不同,java,swing,jar,paint,Java,Swing,Jar,Paint,嘿,我制作了一个java项目,它在Mac上运行得非常好,请参见屏幕截图1。 但是,当我在linux上运行同一个项目时,似乎会遇到一些麻烦。有人知道为什么会发生这种情况吗?看来重新绘制在linux上无法正常工作 private void startGame(){ gameOver = false; loop = new Timer(10, new ActionListener() { @Override public void ac

嘿,我制作了一个java项目,它在Mac上运行得非常好,请参见屏幕截图1。 但是,当我在linux上运行同一个项目时,似乎会遇到一些麻烦。有人知道为什么会发生这种情况吗?看来重新绘制在linux上无法正常工作

private void startGame(){
        gameOver = false;
        loop = new Timer(10, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent x) {

board.play();
frame.repaint();
 }});
 loop.start()}

@Override
public void paint(Graphics g) {

    Point a = board.getBird().getLeftBottemCorner();
    Point b = (board.getBird().getRightUpCorner());
    g.setColor(Color.red);
    g.fillRect(a.x, a.y, b.x - a.x, b.y - a.y);
    drawHurdles(g);
    g.setColor(Color.red);
    g.drawString("Score: " + board.getBird().getHighScore(),10 , board.getBoardHight()+15);


}
    private void drawHurdles(Graphics g) {
g.setColor(Color.black);
ArrayList<Model.BOX> hurdles = board.getHindernisse().getHurdles();
Iterator<BOX> it = hurdles.iterator();
Point a;
Point b;
BOX akt;
int hoehe;
while (it.hasNext()) {
akt = it.next();
hoehe = akt.getRightUpCorner().y - akt.getLeftBottemCorner().y;
a = akt.getLeftBottemCorner();
b = akt.getRightUpCorner();
g.fillRect(a.x, a.y, b.x - a.x,  hoehe);
 System.out.println(a + ", " + b + ", " + hoehe);

}
}
private void startGame(){
gameOver=false;
循环=新计时器(10,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件x){
board.play();
frame.repaint();
}});
loop.start()}
@凌驾
公共空间涂料(图g){
点a=board.getBird().getLeftBottemCorner();
点b=(board.getBird().getRightUpCorner());
g、 setColor(Color.red);
g、 fillRect(a.x,a.y,b.x-a.x,b.y-a.y);
牵引栏(g);
g、 setColor(Color.red);
g、 抽绳(“分数:+board.getBird().getHighScore(),10,board.getBoardHight()+15);
}
专用障碍物(图g){
g、 设置颜色(颜色为黑色);
ArrayList barges=board.gethibirdnisse().getbarges();
Iterator it=barries.Iterator();
a点;
b点;
盒子akt;
内特霍赫;
while(it.hasNext()){
akt=it.next();
hoehe=akt.getRightUpCorner().y-akt.getLeftBottemCorner().y;
a=akt.getLeftBottemCorner();
b=akt.getRightUpCorner();
g、 fillRect(a.x,a.y,b.x-a.x,hoehe);
系统输出打印LN(a+,“+b+”,“+hoehe);
}
}
也许有人知道为什么在linux上重画不干净


您可以尝试处理图形

public void paint (Graphics g) {

       g.setColor (Color.white);
       g.fillRect (0,0,2000,1000);
       // your painting stuff here
       g.dispose();
}

您需要调用
super.paint(g)paint
方法中使用code>,以消除绘制工件。但你甚至不应该在JFrame上画画。相反,在JPanel上绘制并覆盖
paintComponent
并调用
super.paintComponent
。请参见

中的示例和最佳实践。请提供行为异常的代码。请提供代码。没有人能像这样帮助你。-1,你永远不应该处理传递给绘画方法的图形对象。您应该只处理在代码中创建的图形对象。此外,自定义绘制应覆盖paintComponent()而不是paint(),并且在进行自定义绘制之前,应调用super.paintComponent()清除组件背景。@camickr IIRC,无论是覆盖
paint()
还是
paintComponent()
取决于您使用的是AWT还是Swing。@camickr最好覆盖JPanel的绘制方法,这是在Swing中完成游戏最常用的方法。调用super是不必要的。当我想这样做的时候,它会直接把所有的东西都涂满。@Pils19混合了它。在绘制白色矩形后绘制精灵。但这并不是一个真正的解决方案,因为我怀疑您最终会遇到某种内存泄漏。发布完整代码。谢谢,我已经在jPane上画过了。超级。油漆(g)解决了这个问题。