2014-05-13 36 views
0

我想讓我的兩個參數構造函數能夠接受兩個參數,然後爲我設置JComponent的大小。當我這樣做時,我收到錯誤。爲什麼會是這種情況。我重寫了方法,並調用setSize方法從setSize的大小,但我認爲它會導致一個迭代的遞歸調用的stackoverflow。設置自定義組件的大小不工作?

如何在我的個人組件中實現setSize(...),以便我可以讓某人設置組件的大小?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 

import javax.swing.JComponent; 

public class MyComponent extends JComponent { 
    private static final long serialVersionUID = 1L; 

    MyComponent() { 
     super(); 
    } 

    MyComponent(int x, int y) { 
     Dimension d = new Dimension(x,y); 
     this.setSize(d); 
    } 

    @Override 
    public void setSize(Dimension d) { 
     setSize(d); 
    } 

// @Override 
// public void setSize(int x, int y) { 
//  Dimension d = new Dimension(x,y); 
//  setSize(d); 
// } 

    @Override 
    public Dimension getSize() { 
     return this.getSize(); 
    } 

    @Override 
    public void setPreferredSize(Dimension d) { 
     this.setPreferredSize(d); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(100, 25); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawLine(10, 10, 100, 100); 
    } 

    public void paintBorder(Graphics g) { 
     super.paintBorder(g); 
     g.setColor(Color.YELLOW); 
     g.fillRect(0, 0, 50, 50); 
     g.setColor(Color.BLACK); 
     g.drawRect(0, 0, 50, 50); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     paintComponent(g); 
     paintBorder(g); 
     paintChildren(g); 
    } 
} 
    } 

錯誤:

Exception in thread "main" java.lang.StackOverflowError 
    at testpak.MyComponent.setSize(MyComponent.java:23) 
    at testpak.MyComponent.setSize(MyComponent.java:23) 
    at testpak.MyComponent.setSize(MyComponent.java:23) 
    at testpak.MyComponent.setSize(MyComponent.java:23) 
    at testpak.MyComponent.setSize(MyComponent.java:23) 
    ...etc... 

回答

0
@Override 
    public void setSize(Dimension d) { 
     super.setSize(d); 
    } 

你的意思呢?

0

你的直接問題是你的setSize()方法除了自己調用外什麼也不做。它將繼續這樣做直到堆棧空間不足。你爲什麼要重寫這個方法?如果您打算另外做一些事情,請移除您的覆蓋或使用super.setSize()。

順便說一句,控制元件的尺寸比控制元件的尺寸還要多。最大的問題是包含組件的框架/組件使用的佈局管理器可能會根據其規則設置組件的大小。我猜那是你的問題的根源...

+0

// \t @覆蓋 // \t公共無效的setSize(INT X,int y)對{// \t \t super.setSize(新尺寸(X ,Y)); // \t} \t \t這是一個給我一個錯誤。在testpak.MyComponent.setSize在(MyComponent.java:28) \t在java.awt.Component.resize(Component.java:2195) \t在java.awt.Component.setSize(Component.java:2186) \t testpak.MyComponent.setSize(MyComponent.java:28) \t at java.awt.Component.resize(Component.java:2195) –

+0

您是否有鏈接顯示已創建的JComponent,它確實很好? –

+0

@Doug Swing很棒,但它有一個很大的學習曲線。查看Swing教程http://docs.oracle.com/javase/tutorial/uiswing/。您的問題涵蓋了在容器中佈置組件,但您應該完成整個過程。它會最終節省你的時間和很多挫折。 – Steve11235