昨天突然想调以下关于自定义皮肤,想用synth方法,但不知道怎么老是出错..... (我是初学者,请高手帮忙解答)我不明白的地方是:
1:下面几行代码要在那个位置上添加?         
          SynthLookAndFeel synth = new SynthLookAndFeel();
         synth.load(Application1.class.getResourceAsStream("demo.xml"),Application1.class);
         UIManager.setLookAndFeel(synth);
   我模仿网上的例子,在线程里添加并创建窗口,但没能输出!!程序如下:
其中xml文件内容如下:
<synth>
     <style id="label">
       <font name="Monospaced" size="18" style="BOLD ITALIC"/>
       <opaque value="true"/>
       <state>
         <color value="PINK" type="FOREGROUND"/>
         <color value="BLUE" type="BACKGROUND"/>
       </state>
     </style>
     <bind style="label" type="region" key="Label"/>
   
<style id="button">
      <font name="Monospaced" size="18" style="BOLD ITALIC"/>
       <opaque value="true"/>
       <state>
         <color value="PINK" type="FOREGROUND"/>
         <color value="BLUE" type="BACKGROUND"/>
       </state>
     </style>
     <bind style="button" type="region" key="Button"/>
 </synth>

解决方案 »

  1.   

    程序代码如下
    全部程序代码如下:import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.JScrollPane;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    import java.math.BigDecimal; 
    import java.text.DecimalFormat;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableColumnModel;
    import javax.swing.table.TableColumn;
    import java.text.NumberFormat;
    import java.util.Locale;
    import javax.swing.event.*;
    import javax.swing.plaf.synth.SynthLookAndFeel;
    import javax.swing.UIManager;
    import java.io.InputStream;
    import java.text.ParseException;
    public class BankLoan extends JFrame implements ActionListener
    {
        private JButton button=new JButton("计算");
        private JLabel label_monney=new JLabel("贷款总金额");
        private JTextField text_monney=new JTextField();
        private JLabel label_tax=new JLabel("贷款利率");
        private JTextField text_tax=new JTextField(); 
        private JLabel label_pt=new JLabel("贷款期限"); 
        private JTextField text_pt=new JTextField();
        private JLabel label_time=new JLabel("起始时间(年/月)");
        private JTextField text_timey=new JTextField();
        private JTextField text_timem=new JTextField();
        private JDialog dialog=new JDialog(this,"提示",true);
        private Label dialog_label=new Label("请填写完整的信息再进行计算",Label.CENTER);
        private JTable table=new JTable();
        public   Vector srcdata=new Vector();  
        Loan loan_now=new Loan();
        public BankLoan() {
        
            
         super("银行贷款还本利息计算工具");
         final String[] columnNames = {"期次", "本金余额", "月还本金", "月还利息","月还本息"};
            Vector srcdataname=new Vector(); 
            srcdataname.add(columnNames[0]);
            srcdataname.add(columnNames[1]);
            srcdataname.add(columnNames[2]);
            srcdataname.add(columnNames[3]);
            srcdataname.add(columnNames[4]);
            
            Container container=this.getContentPane();
            
         this.setSize(650,400);
         this.setLocation(50,100);
         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
         JPanel panel1=new JPanel(new java.awt.FlowLayout(FlowLayout.CENTER));
         JPanel panel2=new JPanel(new GridLayout(2,6));
         JPanel panel3=new JPanel(new GridLayout(1,1));
          JPanel panel4=new JPanel(new GridLayout(1,3));
            
         panel2.add(label_monney);
         panel2.add(text_monney);
         Label label_yuan=new Label("元");
         panel2.add(label_yuan);
         panel2.add(label_tax);
         panel2.add(text_tax);
         Label label_yuan1=new Label("%/月");
         panel2.add(label_yuan1);
         panel2.add(label_pt);
         panel2.add(text_pt);
         Label label_yuann=new Label("年");
         panel2.add(label_yuann);  
         panel2.add(label_time);
         panel2.add(text_timey);
         panel2.add(text_timem);
         panel1.add(panel2);
         panel1.add(panel3);
         panel3.add(button);
           
            this.add(panel1,BorderLayout.NORTH);    
         button.addActionListener(this);  
            
            DefaultTableModel model=new DefaultTableModel(srcdata,srcdataname); 
            JScrollPane scrollpane=new JScrollPane(table);
            table.setModel(model);
            container.add(scrollpane,BorderLayout.CENTER);
        // this.setVisible(true);
           
            dialog.setSize(250,130);
            dialog.add(dialog_label);
            dialog.setDefaultCloseOperation(HIDE_ON_CLOSE);
        
        }
         
        public void actionPerformed(ActionEvent e){
         if(e.getSource()==button)
         {     
         if(text_monney.getText().length()==0||text_pt.getText().length()==0||text_tax.getText().length()==0||text_timey.getText().length()==0||text_timem.getText().length()==0)
         {
             dialog.setLocation(this.getX()+70,this.getY()+60);
         dialog.setVisible(true);   
         }
         else
         { 
          if(Integer.parseInt(text_timem.getText())<=12&&Integer.parseInt(text_timem.getText())>=1)//输入合法
         {   
         srcdata.clear(); 
               loan_now.init(text_monney.getText(),text_tax.getText(),text_pt.getText(),text_timey.getText(),text_timem.getText());
             Vector dataadd=new Vector(5);
               Vector dataaddx=new Vector(20);
                
                 for(int x=0;x<Integer.parseInt(text_pt.getText())*12;x++)
                 {   
                      srcdata.add(loan_now.GetResult(x));       
                            table.repaint();
                            table.updateUI();
                    }  
              
                    DefaultTableCellRenderer tcr = new DefaultTableCellRenderer(); 
                    TableColumnModel Columnmodel = table.getColumnModel(); 
                    tcr.setBackground(new Color(220,220,150));
                    Columnmodel.getColumn(0).setCellRenderer(tcr);
                    TableColumn tcolumn=new TableColumn();        
                                 
                    table.setColumnSelectionAllowed (true);//设置可否被选择.默认为false
                    table.setColumnSelectionInterval(0,0);
                    table.setSelectionBackground (Color.white);//      
         }//开始计算
         else
                 {
                   dialog_label.setText("起始月份应该在1~12之间,请重新输入!");
                   dialog.setLocation(this.getX()+70,this.getY()+60);
                  dialog.setVisible(true);   
           }
         }
         }
        
        
      
        
        
        }
      
        
        public static void main(String args[])
        {  
           
               SynthLookAndFeel synth = new SynthLookAndFeel();
               try {
                 Class aClass = BankLoan.class;
                 InputStream is = 
                    aClass.getResourceAsStream("synth.xml");
                 if (is == null) {
                   System.err.println("Missing configuration file");
                   System.exit(-1);
                 }
                 synth.load(is, aClass);
               } catch (ParseException e) {
                 System.err.println("Bad configuration file");
                 System.exit(-2);
               }
               try {
                 UIManager.setLookAndFeel(synth);
               } catch 
                  (javax.swing.UnsupportedLookAndFeelException e) {
                 System.err.println("Cannot change to Synth");
                 System.exit(-3);
               }
                BankLoan a=new BankLoan();
                a.setVisible(true);
             }
           
      
               
               
         
        }
      

  2.   

    class Loan{

    private int loan_money;
    private float loan_tax;  
    private int loan_pt;  
    private float Rtrunmm;
    private int loan_year;
    private int loan_month;
        public void init(String str_money,String str_tax,String str_pt,String str_year,String str_month)
        {
            this.loan_money=Integer.parseInt(str_money);
    this.loan_pt=Integer.parseInt(str_pt)*12;
    this.Rtrunmm=(float)this.loan_money/(float)this.loan_pt;
           this.loan_tax=Float.valueOf(str_tax);
           this.loan_year=Integer.parseInt(str_year);
           this.loan_month=Integer.parseInt(str_month);
        }  public Vector GetResult(int x)
        {
              String str=" ";
              Vector data1=new Vector(5); 
          
              NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.CHINA); 
     
           str=String.valueOf(this.loan_year)+"年"+(String.valueOf(this.loan_month))+"月";
           data1.add(str);
           
             if((this.loan_month+1)>12) 
                {this.loan_year++;this.loan_month=1;}   
             else {this.loan_month++;}
       
              str="¥"+numberFormat.format(new BigDecimal(String.valueOf(this.loan_money-((x)*this.Rtrunmm))).setScale(2, BigDecimal.ROUND_HALF_UP));
           data1.add(str);
          
              str="¥"+numberFormat.format(new BigDecimal(String.valueOf(this.Rtrunmm)).setScale(2, BigDecimal.ROUND_HALF_UP));
              data1.add(str);
          
              str="¥"+numberFormat.format(new BigDecimal(String.valueOf(this.loan_tax*(loan_money-(x*this.Rtrunmm))/100)).setScale(2, BigDecimal.ROUND_HALF_UP)); 
              data1.add(str);
     
              str="¥"+ numberFormat.format(new BigDecimal(String.valueOf(this.Rtrunmm+(this.loan_tax*(loan_money-(x*this.Rtrunmm))/100))).setScale(2, BigDecimal.ROUND_HALF_UP));
              data1.add(str);
              
         return data1 ;
        }
    }
      

  3.   

    我已经开始理解这段代码的运行机理了,
     SynthLookAndFeel synth   =newSynthLookAndFeel(); 
     synth.load(Application1.class.getResourceAsStream("demo.xml"),Application1.class); 
     UIManager.setLookAndFeel(synth); 这些必须要放在构造所有SWING组件之前加入,否则效果是出不来的。所以我这段程序应该要改以下组件的添加顺序。
    不知道我想的正不正确呢???