diff Viewer
18615 단어 J#
Const.java
package constData;
public class Const {
final public static int STR_ARRAY_A = 0;
final public static int STR_ARRAY_B = 1;
}
DiffProcessor.java
package processor;
public class DiffProcessor {
final public static int CHAR_SAME=0;
final public static int CHAR_DIFFERENT=1;
final public static int STR_1_ARRAY = 0;
final public static int STR_2_ARRAY = 1;
private String str1;
private String str2;
private int[] str1Array;
private int[] str2Array;
public DiffProcessor(){
super();
}
public DiffProcessor(String str1,String str2){
init(str1, str2);
}
private void init(String str1, String str2) {
this.str1 = str1;
this.str2 = str2;
str1Array = new int[str1.length()];
str2Array = new int[str2.length()];
}
public void reSetString(String str1, String str2){
init(str1,str2);
}
public int[][] process(){
LCS(0,str1.length()-1, 0, str2.length()-1);
int[][] rInt = new int[2][];
rInt[STR_1_ARRAY] = this.str1Array;
rInt[STR_2_ARRAY] = this.str2Array;
return rInt;
}
private static void copyArrayValue (int[] array1, int[] array2){
if (array1.length == array2.length){
for (int i = 0; i< array1.length; i++){
array1[i] = array2[i];
}
} else {
return;
}
}
private void LCS(int str1BeginIndex, int str1EndIndex, int str2BeginIndex, int str2EndIndex){
// System.out.println("$$$$$$$$$$$$$$$$$$$Enter$$$$$$$$$$$$$$$$$");
// System.out.println("Comming Index str1BeginIndex=" + str1BeginIndex);
// System.out.println("Comming Index str1EndIndex =" + str1EndIndex);
// System.out.println("Comming Index str2BeginIndex=" + str2BeginIndex);
// System.out.println("Comming Index str2EndIndex =" + str2EndIndex);
int arrayX = str1EndIndex-str1BeginIndex+1;
int arrayY = str2EndIndex-str2BeginIndex+1;
int[][] LCSArray = new int[2][arrayY];
int maxValue = 0;
int xMax = 0;
int yMax = 0;
for (int x = 0; x < arrayX; x++){
for (int y = 0; y < arrayY; y++){
if (str1.charAt(x+str1BeginIndex)==str2.charAt(y+str2BeginIndex)){
if (x>0 && y>0){
LCSArray[1][y]=LCSArray[0][y-1] +1;
if (LCSArray[1][y]> maxValue){
maxValue = LCSArray[1][y];
xMax = x;
yMax = y;
}
}else{
LCSArray[1][y]=1;
}
}else {
LCSArray[1][y]=0;
}
// System.out.print(LCSArray[1][y]);
}
copyArrayValue(LCSArray[0], LCSArray[1]);
//LCSArray[0] = LCSArray[1];
// System.out.println();
}
if (maxValue != 0){
// System.out.println("xMax:" + xMax);
// System.out.println("yMax:" + yMax);
// System.out.println("maxValue:" + maxValue);
// System.out.println("yMax-maxValue+1,yMax+1:" + str2.substring(yMax-maxValue+1,yMax+1));
//return str1.substring(xMax-maxValue+1, xMax+1);
// for the same part, mark str1Array and str2Array corresponding part to 0
int xSamePartStartIndex = str1BeginIndex + xMax - maxValue + 1;
int xSamePartEndIndex = xSamePartStartIndex + maxValue -1;
int ySamePartStartIndex = str2BeginIndex + yMax - maxValue + 1;
int ySamePartEndIndex = ySamePartStartIndex + maxValue -1;
for (int i = xSamePartStartIndex; i <= xSamePartEndIndex; i++){
str1Array[i]=0;
}
for (int i = ySamePartStartIndex; i <= ySamePartEndIndex; i++){
str2Array[i]=0;
}
// for the difference part including pre-diff and post-diff, continue use LCS() to find out the same part;
// System.out.println("xSamePartStartIndex:" + xSamePartStartIndex);
// System.out.println("xSamePartEndIndex:" + xSamePartEndIndex);
// System.out.println("ySamePartStartIndex:" + ySamePartStartIndex);
// System.out.println("ySamePartEndIndex:" + ySamePartEndIndex);
// System.out.println("==========================================");
// System.out.println("xSamePartStartIndex - str1BeginIndex:" + (xSamePartStartIndex - str1BeginIndex));
// System.out.println("str1EndIndex - xSamePartEndIndex:" + (str1EndIndex - xSamePartEndIndex));
// System.out.println("ySamePartStartIndex - str2BeginIndex:" + (ySamePartStartIndex - str2BeginIndex));
// System.out.println("str2EndIndex - ySamePartEndIndex:" + (str2EndIndex - ySamePartEndIndex));
if (xSamePartStartIndex - str1BeginIndex <= 0){
for (int i = str2BeginIndex; i<ySamePartStartIndex; i++){
str2Array[i] = 1;
}
} else if (ySamePartStartIndex - str2BeginIndex <= 0){
for (int i = str1BeginIndex; i<xSamePartStartIndex; i++){
str1Array[i] = 1;
}
} else {
LCS(str1BeginIndex, xSamePartStartIndex-1, str2BeginIndex, ySamePartStartIndex-1 );
}
if (str1EndIndex - xSamePartEndIndex <=0){
for (int i = ySamePartEndIndex+1; i<=str2EndIndex; i++){
str2Array[i] = 1;
}
} else if(str2EndIndex - ySamePartEndIndex <=0){
for (int i = xSamePartEndIndex+1; i<=str1EndIndex; i++){
str1Array[i] = 1;
}
} else {
LCS(xSamePartEndIndex+1, str1EndIndex, ySamePartEndIndex+1, str2EndIndex);
}
} else {
// System.out.println("===There are no any same part between===" );
// System.out.println("String A:" + str1.substring(str1BeginIndex, str1EndIndex+1));
// System.out.println("String B:" + str2.substring(str2BeginIndex, str2EndIndex+1));
//for the different part, mark str1Array and str2Array corresponding part to 1
for (int i = str1BeginIndex; i <= str1EndIndex; i++){
str1Array[i]=1;
}
for (int i = str2BeginIndex; i <= str2EndIndex; i++){
str2Array[i]=1;
}
return;
}
}
}
ProcessorManager.java
package processor;
public class ProcessorManager {
public static ProcessorManager processorManager;
private DiffProcessor diffProcessor;
public DiffProcessor getDiffProcessor() {
return diffProcessor;
}
public void setDiffProcessor(DiffProcessor diffProcessor) {
this.diffProcessor = diffProcessor;
}
public static synchronized ProcessorManager getInstance(){
if (processorManager == null){
processorManager = new ProcessorManager();
}
return processorManager;
}
}
UIManager.java
package ui;
import java.awt.Color;
import javax.swing.JTextPane;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
public class UIManager {
private static UIManager uiManager;
public static synchronized UIManager getInstance(){
if (uiManager == null){
uiManager = new UIManager();
}
return uiManager;
}
private JTextPane jTextPaneA;
private JTextPane jTextPaneB;
MutableAttributeSet diffAttr;
MutableAttributeSet defaultAttr;
public UIManager(){
iniAttr();
}
public void iniAttr(){
diffAttr = new SimpleAttributeSet();
defaultAttr = new SimpleAttributeSet();
StyleConstants.setForeground(diffAttr, Color.red);
StyleConstants.setForeground(defaultAttr, Color.black);
}
public MutableAttributeSet getDefaultAttr() {
return defaultAttr;
}
public void setDefaultAttr(MutableAttributeSet defaultAttr) {
this.defaultAttr = defaultAttr;
}
public MutableAttributeSet getDiffAttr() {
return diffAttr;
}
public JTextPane getJTextPaneA() {
return jTextPaneA;
}
public JTextPane getJTextPaneB() {
return jTextPaneB;
}
public void setDiffAttr(MutableAttributeSet diffAttr) {
this.diffAttr = diffAttr;
}
public void setJTextPaneA(JTextPane textPaneA) {
jTextPaneA = textPaneA;
}
public void setJTextPaneB(JTextPane textPaneB) {
jTextPaneB = textPaneB;
}
}
ViewerFrame.java
package ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BoundedRangeModel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.Timer;
import javax.swing.WindowConstants;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import constData.Const;
import processor.DiffProcessor;
import processor.ProcessorManager;
public class ViewerFrame extends JFrame{
private JTextPane jTextPaneA;
private JTextPane jTextPaneB;
public ViewerFrame()
{
VierMenuBar menuTest = new VierMenuBar();
CenterPanel centerPanel = new CenterPanel();
BottomPanel bottomPanel = new BottomPanel();
Container c = this.getContentPane();
// c.setLayout(new BorderLayout())
this.setJMenuBar(menuTest);
c.add(centerPanel,BorderLayout.CENTER);
c.add(bottomPanel,BorderLayout.SOUTH);
this.addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
dispose();
System.exit(0);
}
});
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(700,500);
setTitle("DiffViewer1.0");
setLocation(200,150);
setVisible(true);
}
class VierMenuBar extends JMenuBar
{
private JDialog aboutDialog;
public VierMenuBar()
{
JMenu fileMenu = new JMenu("File");
JMenuItem exitMenuItem = new JMenuItem("Exit",KeyEvent.VK_E);
JMenuItem aboutMenuItem = new JMenuItem("About",KeyEvent.VK_A);
fileMenu.add(exitMenuItem);
fileMenu.add(aboutMenuItem);
this.add(fileMenu);
aboutDialog = new JDialog();
initAboutDialog();
exitMenuItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dispose();
System.exit(0);
}
});
aboutMenuItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
aboutDialog.setVisible(true);
}
});
}
public JDialog getAboutDialog()
{
return aboutDialog;
}
public void initAboutDialog()
{
aboutDialog.setTitle("About");
Container con =aboutDialog.getContentPane();
Icon icon = new ImageIcon("smile.gif");
JLabel aboutLabel = new JLabel("<html><b><font size=5>"+
"<center>Jay"+"<br>Test Version",icon,JLabel.CENTER);
con.add(aboutLabel,BorderLayout.CENTER);
aboutDialog.setSize(450,225);
aboutDialog.setLocation(300,300);
aboutDialog.addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
dispose();
}
});
}
}
class CenterPanel extends JPanel
{
public CenterPanel()
{
JScrollPane jScrollPane1 = new JScrollPane();
JScrollPane jScrollPane2 = new JScrollPane();
JTextPane jTextPaneA = new JTextPane();
JTextPane jTextPaneB = new JTextPane();
UIManager.getInstance().setJTextPaneA(jTextPaneA);
UIManager.getInstance().setJTextPaneB(jTextPaneB);
jTextPaneA.setDocument(new DefaultStyledDocument());
jTextPaneB.setDocument(new DefaultStyledDocument());
jScrollPane1.setViewportView(jTextPaneA);
jScrollPane2.setViewportView(jTextPaneB);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jScrollPane1,jScrollPane2);
this.setLayout(new BorderLayout());
this.add(splitPane,BorderLayout.CENTER);
this.setEnabled(true);
}
}
class BottomPanel extends JPanel
{
public BottomPanel()
{
JButton compareButton = new JButton("Compare");
compareButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("Press the button!!");
JTextPane jTextPaneA = UIManager.getInstance().getJTextPaneA();
JTextPane jTextPaneB = UIManager.getInstance().getJTextPaneB();
DefaultStyledDocument docA = (DefaultStyledDocument)jTextPaneA.getDocument();
DefaultStyledDocument docB = (DefaultStyledDocument)jTextPaneB.getDocument();
try {
String str1 = docA.getText(0, docA.getLength());
String str2 = docB.getText(0, docB.getLength());
DiffProcessor processor = ProcessorManager.getInstance().getDiffProcessor();
processor.reSetString(str1, str2);
int[][] result = processor.process();
// for (int i=0; i<result.length; i++){
// for (int j=0; j<result[i].length; j++){
// System.out.print(result[i][j]);
// }
// System.out.println();
// }
MutableAttributeSet diffAttr = UIManager.getInstance().getDiffAttr();
MutableAttributeSet defaultAttr = UIManager.getInstance().getDefaultAttr();
// set jTextPaneA
for (int i = 0; i<result[Const.STR_ARRAY_A].length; i++){
if (result[Const.STR_ARRAY_A][i] == 1){
docA.setCharacterAttributes(i, 1, diffAttr, true);
} else {
docA.setCharacterAttributes(i, 1, defaultAttr, true);
}
}
// set jTextPaneB
for (int i=0; i<result[Const.STR_ARRAY_B].length ; i++){
if (result[Const.STR_ARRAY_B][i] == 1){
docB.setCharacterAttributes(i, 1, diffAttr, true);
} else {
docB.setCharacterAttributes(i, 1, defaultAttr, true);
}
}
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
});
this.setLayout(new BorderLayout());
this.add(compareButton,BorderLayout.CENTER);
}
}
public static void main(String args[]){
new ViewerFrame();
ProcessorManager.getInstance().setDiffProcessor(new DiffProcessor());
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JS 동적 추가 삭제 테이블텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.