Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
上角的Java绘图按钮动画_Java_User Interface_Jbutton_Artifacts_Visual Glitch - Fatal编程技术网

上角的Java绘图按钮动画

上角的Java绘图按钮动画,java,user-interface,jbutton,artifacts,visual-glitch,Java,User Interface,Jbutton,Artifacts,Visual Glitch,我有一个带有边框布局的JFrame,它有两个JPanels。框架南部的一个JPanel有一些jbutton(一个n编号),另一个显示一个connect-4板(这是用于CS类)。出于某种奇怪的原因,我有一个wierd bug,按钮的动画显示在左上角 这是一个相当奇怪的错误,我不是swing方面的专家。我想知道这是否与我在一个JPanel中运行paint方法([使用repaint(),我认为它在另一个线程上)和在另一个JPanel中运行actionPerformed有关(我认为它在另一个线程上)在

我有一个带有边框布局的
JFrame
,它有两个
JPanel
s。框架南部的一个
JPanel
有一些jbutton(一个
n
编号),另一个显示一个connect-4板(这是用于CS类)。出于某种奇怪的原因,我有一个wierd bug,按钮的动画显示在左上角

这是一个相当奇怪的错误,我不是swing方面的专家。我想知道这是否与我在一个
JPanel
中运行
paint
方法([使用
repaint()
,我认为它在另一个线程上)和在另一个
JPanel
中运行
actionPerformed
有关(我认为它在另一个线程上)在渲染过程中出现了一些冲突或混乱。只是一个猜测

以下是一些GUI代码:

class Connect4GUI extends JFrame implements SetSpotInterface
{
    private Connect4 connect4;
    private Connect4PieceDisplay pieceDisplay;
    public static final String DEFAULT_TITLE = "Connect 4";
    //...
    public Connect4GUI( Connect4 connect4_, String title )
    {
        setTitle( title );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        connect4 = connect4_;
        pieceDisplay = new Connect4PieceDisplay( this );
        add( new Connect4ButtonDispencer( this ), BorderLayout.SOUTH );
        add( new Connect4PieceDisplay( this ), BorderLayout.CENTER );
        pack();
        setVisible( true );
    }
    public Connect4GUI( Connect4 connect4_ ) {
        this( connect4_, DEFAULT_TITLE );
    }
    public Connect4GUI() {
        this( new Connect4() );
    }
    //...
}

abstract class Connect4PanelComponent extends JPanel
{
    public static final Connect4GUI DEFAULT_DISPLAY_WINDOW = null;
    public final static Color DEFAULT_BACKROUND_COLOR = Color.YELLOW;
    Connect4GUI displayGUI;
    public Color backroundColor;
}

class Connect4PieceDisplay extends Connect4PanelComponent
{
    XY offsetScaler, offsetModifier, pixelOffset, spacingModifier, spacingPixelOffset;
    public final static XY DEFAULT_OFFSET_SCALER = new XY( 5, 5 );
    public final static XY DEFAULT_OFFSET_MODIFIER = new XY( 1, 1 );
    public final static XY DEFAULT_PIXEL_OFFSET = new XY( 6, 6 );
    public final static XY DEFAULT_SPACING_MODIFIER = new XY( 2, 2 );
    public final static XY DEFAULT_SPACING_PIXEL_OFFSET = new XY( 0, 0 );
    public Connect4PieceDisplay( Connect4GUI displayGUI_, XY offsetScaler_, XY offsetModifier_, XY pixelOffset_, XY spacingModifier_, XY spacingPixelOffset_, Color backroundColor_ )
    {
        super();
        displayGUI = displayGUI_;
        offsetScaler = offsetScaler_;
        offsetModifier = offsetModifier_;
        pixelOffset = pixelOffset_;
        spacingModifier = spacingModifier_;
        spacingPixelOffset = spacingPixelOffset_;
        backroundColor = backroundColor_;

        setOpaque( true );
        setBackground( backroundColor );
    }
    public Connect4PieceDisplay( Connect4GUI displayGUI_, XY offsetScaler_, XY offsetModifier_, XY pixelOffset_, XY spacingModifier_, XY spacingPixelOffset_ ) {
        this( displayGUI_, offsetScaler_, offsetModifier_, pixelOffset_, spacingModifier_, spacingPixelOffset_, DEFAULT_BACKROUND_COLOR );
    }
    public Connect4PieceDisplay( Connect4GUI displayGUI_, XY offsetScaler_, XY offsetModifier_, XY pixelOffset_, XY spacingModifier_ ) {
        this( displayGUI_, offsetScaler_, offsetModifier_, pixelOffset_, spacingModifier_, new XY( DEFAULT_SPACING_PIXEL_OFFSET ) );
    }
    public Connect4PieceDisplay( Connect4GUI displayGUI_, XY offsetScaler_, XY offsetModifier_, XY pixelOffset_ ) {
        this( displayGUI_, offsetScaler_, offsetModifier_, pixelOffset_, new XY( DEFAULT_SPACING_MODIFIER ) );
    }
    public Connect4PieceDisplay( Connect4GUI displayGUI_, XY offsetScaler_, XY offsetModifier_ ) {
        this( displayGUI_, offsetScaler_, offsetModifier_, new XY( DEFAULT_PIXEL_OFFSET ) );
    }
    public Connect4PieceDisplay( Connect4GUI displayGUI_, XY offsetScaler_ ) {
        this( displayGUI_, offsetScaler_, new XY( DEFAULT_OFFSET_MODIFIER ) );
    }
    public Connect4PieceDisplay( Connect4GUI displayGUI_ ) {
        this( displayGUI_, new XY( DEFAULT_OFFSET_SCALER ) );
    }
    public Connect4PieceDisplay() {
        this( DEFAULT_DISPLAY_WINDOW );
    }
    public void DefaultSetUpModifiers( int offset, int offsetModifier_, int spacing, int spacingPixel )
    {
        offsetScaler = new XY( offset, offset );
        offsetModifier = new XY( offsetModifier_, offsetModifier_ );
        pixelOffset = new XY( ( offset + 1 ), ( offset + 1 ) );
        spacingModifier = new XY( spacing, spacing );
        spacingPixelOffset = new XY( spacingPixel, spacingPixel );
    }
    public void paint( Graphics graphics )
    {
        final int X_DIMENTION = displayGUI.GetConnect4().dimentions.x;
        final int Y_DIMENTION = displayGUI.GetConnect4().dimentions.y;
        final int X_SPACING = ( getWidth() / X_DIMENTION );
        final int Y_SPACING = ( getHeight() / Y_DIMENTION );
        final int AMOUNT_OF_COLORS_IN_COLOR_MAP = displayGUI.colorMap.size();
        for( int i = 0; i < X_DIMENTION; ++i )
        {
            for( int j = 0; j < Y_DIMENTION; ++j )
            {
                final char CURRENT_SYMBOL = displayGUI.GetConnect4().GetSpot( i, j );
                for( int o = 0; o < AMOUNT_OF_COLORS_IN_COLOR_MAP; ++o )
                {
                    if( CURRENT_SYMBOL == displayGUI.colorMap.get( o ).GetSymbol() ) {
                        graphics.setColor( displayGUI.colorMap.get( o ).GetColor() );
                        break;
                    }
                }
                graphics.fillOval( AttainXOffset( i ), AttainYOffset( j ), AttainXSpacing(), AttainYSpacing() );
            }
        }
        repaint();
    }
    public int AttainXOffset( int x ) {
        final int X_SPACING = ( getWidth() / displayGUI.GetConnect4().dimentions.x );
        return ( ( X_SPACING / DEFAULT_OFFSET_SCALER.x ) + DEFAULT_PIXEL_OFFSET.x + ( X_SPACING * DEFAULT_OFFSET_MODIFIER.x * x ) );
    }
    public int AttainYOffset( int y ) {
        final int Y_SPACING = ( getHeight() / displayGUI.GetConnect4().dimentions.y );
        return ( ( Y_SPACING / DEFAULT_OFFSET_SCALER.y ) + DEFAULT_PIXEL_OFFSET.y + ( Y_SPACING * DEFAULT_OFFSET_MODIFIER.y * y ) );
    }
    public int AttainXSpacing() {
        final int X_SPACING = ( getWidth() / displayGUI.GetConnect4().dimentions.x );
        return ( ( X_SPACING / DEFAULT_SPACING_MODIFIER.x ) + DEFAULT_SPACING_PIXEL_OFFSET.x );
    }
    public int AttainYSpacing() {
        final int Y_SPACING = ( getHeight() / displayGUI.GetConnect4().dimentions.y );
        return ( ( Y_SPACING / DEFAULT_SPACING_MODIFIER.y ) + DEFAULT_SPACING_PIXEL_OFFSET.y );
    }
}

class Connect4ButtonDispencer extends Connect4PanelComponent implements ActionListener
{
    public final static String DEFAULT_BUTTON_MESSAGE = "";
    public final static int DEPTH_OF_BUTTON_GRID = 1;
    public JButton[] dispencerButtons;
    public String buttonMessage;
    public Connect4ButtonDispencer( Connect4GUI displayGUI_, Color backroundColor_, int amountOfDispencerButtons_, String buttonMessage_ )
    {
        super();
        displayGUI = displayGUI_;
        backroundColor = backroundColor_;
        buttonMessage = buttonMessage_;
        setLayout( new GridLayout( DEPTH_OF_BUTTON_GRID, amountOfDispencerButtons_ ) );
        dispencerButtons = DefaultSetUpDispencerButtons( amountOfDispencerButtons_ );
        buttonMessage = buttonMessage_;
        setOpaque( true );
        setBackground( backroundColor );
    }
    public Connect4ButtonDispencer( Connect4GUI displayGUI_, Color backroundColor_, int amountOfDispencerButtons_ ) {
        this( displayGUI_, backroundColor_, amountOfDispencerButtons_, DEFAULT_BUTTON_MESSAGE );
    }
    public Connect4ButtonDispencer( Connect4GUI displayGUI_, Color backroundColor_ ) {
        this( displayGUI_, backroundColor_, displayGUI_.GetConnect4().dimentions.x );
    }
    public Connect4ButtonDispencer( Connect4GUI displayGUI_ ) {
        this( displayGUI_, DEFAULT_BACKROUND_COLOR );
    }
    public Connect4ButtonDispencer() {
        this( DEFAULT_DISPLAY_WINDOW );
    }
    public JButton[] DefaultSetUpDispencerButtons( int length )
    {
        dispencerButtons = new JButton[ length ];
        //What if I change something in between when I declare the array and the 'for' loop?//
        final int AMOUNT_OF_DISPENCER_BUTTONS = dispencerButtons.length;
        for( int i = 0; i < AMOUNT_OF_DISPENCER_BUTTONS; ++i )
        {
            dispencerButtons[ i ] = new JButton( ( buttonMessage + ( i + 1 ) ) );
            dispencerButtons[ i ].addActionListener( this );
            add( dispencerButtons[ i ] );
        }
        return dispencerButtons;
    }
    public void actionPerformed( ActionEvent event )
    {
        final int AMOUNT_OF_DISPENCER_BUTTONS = dispencerButtons.length;
        for( int i = 0; i < AMOUNT_OF_DISPENCER_BUTTONS; ++i )
        {
            System.out.println( "A" );
            if( dispencerButtons[ i ] == event.getSource() )
            {
                System.out.println( "B" );
                //...it could change dynamically especially when this is on a thread. #parinoi .//
                final int Y_DIMENTIONS = displayGUI.GetConnect4().dimentions.y;
                for( int j = ( Y_DIMENTIONS - 1 ); j >= 0; --j )
                {
                    if( displayGUI.GetConnect4().GetSpot( i, j ) == Connect4.EMPTY_SPOT )
                    {
                        displayGUI.GetConnect4().SetSpot( i, j, displayGUI.turnSymbol );
                        displayGUI.ChangeTurn();
                        break;
                    }
                }
                break;
            }
        }
    }
}
class Connect4GUI扩展JFrame实现SetSpotInterface
{
私有连接4连接4;
专用连接4件显示件显示;
公共静态最终字符串默认值\u TITLE=“Connect 4”;
//...
公共连接4GUI(连接4连接4,字符串标题)
{
片名(片名);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
connect4=connect4;
pieceDisplay=新的Connect4PieceDisplay(此);
添加(新的Connect4ButtonDispencer(本),BorderLayout.SOUTH);
添加(新的Connect4PieceDisplay(this),BorderLayout.CENTER);
包装();
setVisible(真);
}
公共连接4GUI(连接4连接4){
这(连接4,默认标题);
}
公共连接4GUI(){
这个(新的Connect4());
}
//...
}
抽象类Connect4PanelComponent扩展了JPanel
{
公共静态最终连接4GUI默认显示窗口=null;
公共最终静态颜色默认值\u BACKROUND\u Color=Color.YELLOW;
连接4GUI显示GUI;
公共色背景色;
}
类Connect4PieceDisplay扩展了Connect4PanelComponent
{
XY偏移缩放器、偏移修改器、像素偏移、间距修改器、间距像素偏移;
公共最终静态XY默认值\偏移量\缩放器=新XY(5,5);
公共最终静态XY默认值_偏移_修改器=新XY(1,1);
公共最终静态XY默认像素偏移=新XY(6,6);
公共最终静态XY默认_间距_修改器=新XY(2,2);
公共最终静态XY默认间距像素偏移=新XY(0,0);
公共连接4部件显示(连接4GUI显示GUI、XY偏移量缩放器、XY偏移量修改器、XY像素偏移量、XY间距修改器、XY间距像素偏移量、颜色背景颜色)
{
超级();
displayGUI=displayGUI;
offsetScaler=offsetScaler;
offsetModifier=offsetModifier_u2;;
pixelOffset=pixelOffset;
间距修改器=间距修改器;
spacingPixelOffset=spacingPixelOffset;
backroundColor=backroundColor;
set不透明(true);
挫折背景(背景色);
}
公共Connect4PieceDisplay(Connect4GUI显示GUI、XY偏移量缩放器、XY偏移量修改器、XY像素偏移量、XY间距修改器、XY间距像素偏移量){
这(显示图形用户界面、偏移缩放器、偏移修改器、像素偏移量、间距修改器、间距像素偏移量、默认背景颜色);
}
公共Connect4PieceDisplay(Connect4GUI显示GUI、XY偏移量缩放器、XY偏移量修改器、XY像素偏移量、XY间距修改器){
这(显示GUI、偏移缩放器、偏移修改器、像素偏移量、间距修改器、新XY(默认间距、像素偏移量));
}
公共Connect4PieceDisplay(Connect4GUI显示GUI、XY偏移量缩放器、XY偏移量修改器、XY像素偏移量){
这(显示图形用户界面、偏移缩放器、偏移修改器、像素偏移、新XY(默认间距修改器));
}
公共连接4部件显示(连接4GUI显示GUI、XY偏移量缩放器、XY偏移量修改器){
这(显示图形用户界面、偏移缩放器、偏移修改器、新XY(默认像素偏移));
}
公共连接4部件显示(连接4GUI显示GUI,XY偏移量缩放器){
这(displayGUI、offsetScaler、新XY(默认偏移量修饰符));
}
公共连接4部件显示(连接4GUI显示GUI){
这(显示GUI、新XY(默认偏移量缩放器));
}
公共连接4pieceDisplay(){
这(默认的显示窗口);
}
public void DefaultSetUpModifiers(int offset、int offsetModifier、int间距、int间距像素)
{
偏移量缩放器=新XY(偏移量,偏移量);
偏移修饰符=新XY(偏移修饰符,偏移修饰符);
像素偏移=新XY((偏移+1),(偏移+1));
间距修改器=新XY(间距,间距);
spacingPixelOffset=新XY(spacingPixel,spacingPixel);
}
公共空间绘制(图形)
{
final int X_dimensions=displayGUI.GetConnect4().dimensions.X;
final int Y_dimension=displayGUI.GetConnect4().dimensions.Y;
最终整数X_间距=(getWidth()/X_维度);
最终整数Y_间距=(getHeight()/Y_维度);
颜色映射=displayGUI.colorMap.size()中颜色的最终整数量;
对于(int i=0;i